将变量从函数传递到函数内的函数

Passing variable from a function to a function within a function

我正在尝试创建一个 chrome 扩展,它通过上下文菜单获取选定的文本,将其附加到 url 并使用新的更新现有选项卡(来自同一域) URL。 这是我的代码:

function soso(search_target){
    alert(search_target);
    //search_target gets here successfully 

    chrome.tabs.query({
        url: "https://lightning.force.com/lightning/*"},
        function(tabs, search_target){

        if (tabs[0]){

            chrome.tabs.update(tabs[0].id, {
                url: "http://www.facebook.com"+search_target, //search_target doesnt get here
                active: true
            });
        }
        else{
            alert("no window");
        }
        });
}


function selectionHandler (info, tab)
{
        soso( info.selectionText);
}

function resetContextMenus ()
{
    chrome.contextMenus.removeAll(
    function()
    {
            var id = chrome.contextMenus.create( {
                title: "Open in Salesforce",
                contexts: [ "selection" ],
            onclick: selectionHandler
        } );
    }
    );
}
resetContextMenus();

问题是我无法将 search_target 传递给 chrome.tabs.update,我在 URL 之后得到一个 undefined

关于如何传递这个变量有什么想法吗?

让我们回顾一下我们的分析:

  • 您尝试调用 chrome.tabs.update,传递 search_target
  • 在具有 search_target 参数的回调 function
  • 函数被chrome.tabs.query
  • 调用
  • 而不是你的外层function
  • 但是你在外部上下文中有一个有效的search_target
  • 无法从回调块访问 function 因为具有相似名称但未定义的参数隐藏了它

解决方案:删除参数以允许在回调中知道外部上下文的变量function:

function soso(search_target){
    alert(search_target);
    //search_target gets here successfully 

    chrome.tabs.query({
        url: "https://lightning.force.com/lightning/*"},
        function(tabs){

        if (tabs[0]){

            chrome.tabs.update(tabs[0].id, {
                url: "http://www.facebook.com"+search_target, //search_target doesnt get here
                active: true
            });
        }
        else{
            alert("no window");
        }
        });
}


function selectionHandler (info, tab)
{
        soso( info.selectionText);
}

function resetContextMenus ()
{
    chrome.contextMenus.removeAll(
    function()
    {
            var id = chrome.contextMenus.create( {
                title: "Open in Salesforce",
                contexts: [ "selection" ],
            onclick: selectionHandler
        } );
    }
    );
}
resetContextMenus();