我正在学习Chrome扩展程序的编码,我对将参数传递给异步函数以及可能的并发问题感到好奇。让我举个例子:
function updateActiveTab(param1)
{
chrome.tabs.query({active: true, currentWindow: true}, function(tabs)
{
onUpdatingTab(tabs[0].id, param1);
});
}
function onUpdatingTab(tabID, param1)
{
console.log("Tag ID=" + tabID + ", param=" + param1);
}
因此,我们假设第一次使用updateActiveTab()
调用param1=1
方法,并且对chrome.tabs.query()
的调用需要一段时间。在此期间,虽然仍在处理chrome.tabs.query()
,但我的updateActiveTab()
方法会再次使用param1=2
进行调用。当第一次调用chrome.tabs.query()
返回并开始处理其回调函数时会发生什么? param1
会1
还是2
?
我显然希望将param1
作为1和2传递给其功能的相应电话。
答案 0 :(得分:1)
简短的回答是你会获胜。阅读JavaScript闭包,真正了解这里发生了什么。我会点击亮点,让你明白这一点。
对onUpdatingTab内部的param1的引用强制param1进入闭包。只要调用内部函数需要,闭包就会使param1的值保持活动状态。您描述的场景将创建两个不同的闭包,每次调用onUpdatingTab。
以下是一个改编自JavaScript的示例:Good Parts,它说明了闭包的这个方面。此函数接受一组DOM节点,并添加一个显示节点序号的onclick处理程序:
function add_the_handlers = function (nodes) {
var helper = function(i) {
return function(e) { alert(i); };
};
var i;
for (i = 0; i < nodes.length; i += 1) {
nodes[i].onclick = helper(i);
}
}
每次调用helper都会返回一个函数,其中引用了&#34; i&#34;绑定为该帮助程序调用的闭包。请注意与不使用帮助程序的代码的语义区别,但只是这样做:
nodes[i].onclick = function() { alert(i); }
在这里&#34;我&#34;再次绑定到一个闭包,但它是与add_the_handlers调用相关的闭包,因此单击每个节点会显示相同的值,即不是序数的节点数。这是分配给&#34; i&#34;。
的最后一个值