首页 > 解决方案 > 将变量从函数传递到函数内的函数

问题描述

我正在尝试创建一个 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_targetchrome.tabs.update,我undefined在 URL 之后得到一个。

关于如何传递这个变量的任何想法?

标签: javascriptfunctiongoogle-chromegoogle-chrome-extensiongoogle-chrome-devtools

解决方案


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

  • 你试着打电话chrome.tabs.update,通过search_target
  • function在具有search_target参数的回调中
  • 该函数由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();

推荐阅读