在 Javascript 中,语法a.b
可以替换为a["b"]
. 所以在你的情况下你可以使用
window["funcOne"](target)["funcTwo"](x, y, z);
"funcOne"
当然,只有在使用变量而不是and时才有意义"funcTwo"
。
如果一切都是固定的,但您只是想延迟执行,您可以使用带有匿名闭包的“thunking”
x = function(){ return funcOne(target).funcTwo(x, y, z); };
然后您可以评估 withx()
以在以后获得所需的结果。
即使变量target
and和是封闭范围的本地变量,最后一个示例也将正常工作,因为 thunking 闭包将“捕获”它们x
。y
z
但是,您应该注意这样一个事实,即在 Javascript 中创建新范围的唯一方法是使用函数(一个被包围的块,{
而}
不是像 C++ 和其他语言中那样的范围)。
如果你需要在一个循环中创建几个闭包,这可能会反击,并且是一个非常常见的错误的根源......
for (var i=0; i<options.length; i++)
{
var menu_item = document.createElement("div");
menu_item.textContent = "Option " + i;
menu_item.onclick = function () {
// Warning this will NOT work. All divs will
// alert using the same number!
alert("Option " + i + " selected");
}
menu.appendChild(menu_item);
}
在这里,我为 div 上的事件使用了一个闭包onclick
,但这不起作用,因为所有这些函数都将使用相同的i
变量。因为在 Javascript 中创建作用域的唯一方法是使用函数,所以解决方案是:
for (var i=0; i<options.length; i++)
{
var menu_item = document.createElement("div");
menu_item.textContent = "Option " + i;
(function(i){
menu_item.onclick = function () {
alert("Option " + i + " selected");
};
})(i); // Pass current `i` as parameter
menu.appendChild(menu_item);
}
这样,处理程序中的变量i
对于onclick
每个闭包都是不同的。
当您需要创建许多独立的闭包时,这种创建函数只是为了立即调用它的模式通常在 Javascript 中使用,因此最好了解和理解它。