嵌套javascript函数调用中的变量范围

时间:2015-09-01 13:22:07

标签: javascript google-chrome-extension

在下面的代码中,我想知道doStuffWithReport函数中tabId的值是什么。它是否与调用sendMessage时发送的tabId的值相同,或者它可能在期间发生变化?

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    // we suppose that tabId is 5.
    function doStuffWithReport(report) {
       // what would be the value of tabId? still 5? or it might change to
       // something else if, in the meantime, we received another 
       // call for chrome.tabs.onUpdated?
    }
    // we are sending a message to tabId 5.
    chrome.tabs.sendMessage(tabId, {
        text: 'report_me'
    }, doStuffWithReport);
});

编辑:我自己测试过。它保持不变,即即使在chrome.tab.onUpdated上有另一个调用,tabId仍将保持为5。

1 个答案:

答案 0 :(得分:1)

好吧,首先让我们简化代码以查看基本行为:

function outside(){
  var out = 5;
  function inside(){
    console.log(out);
  }
  inside();
}

在这个示例中,当outside被调用时显然会打印出5,但由于inside仅在本地定义,因此除非在outside内调用,否则它将是未定义的。

为了使它更复杂一点,不要让它变成静态的,并根据参数得出它:

function outside(out){
  function inside(){
    console.log(out);
  }
  inside();
}

现在它几乎和以前一样,并且会立即打印出我们用作参数的任何内容。让我们通过在一段时间的随机时间之后调用inside并将当前的out值与当时打印的out值进行比较来使其更加异步。在连续几次调用它时调用inside。

function outside(out){
  function inside(){
    var dt = Date.now();
    console.log(dt + ' : ' +out);
  }
  var n = Math.floor(Math.random() * 1000);
  var d = Date.now()+n;
  console.log(d + ' : ' + out);
  setTimeout(inside,n);
}
for(var x=0;x<25;x++){outside(x);}

从此输出中,我们可以看到out在调用时inside的值与我们为inside设置超时时的值相同被称为。

从这里我们可以说tabId在调用doStuffWithReport时确实仍然是5。