Передача переменной из функции в функцию внутри функции - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь создать расширение 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, я получаю undefined после URL.

Любые идеи о том, как передать эту переменную?

1 Ответ

0 голосов
/ 19 февраля 2020

Давайте вернемся назад с нашим анализом:

  • вы пытаетесь вызвать 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();
...