在下面的代码中,我想知道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。
答案 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。