所以我通过许多不同的方法阅读了使用window[]();
和eval();
从字符串调用函数的方法。我想知道我的情况(即下面)是什么方法才是正确的方法,如果是的话,解释原因。还解释了为什么eval();
不是一个很好的选择,很多人都说安全性,但如果你能获得任何能够让你更改该页面上的脚本的浏览器插件,为什么安全性会成为一个问题呢? (例如:firefox的firebug)
我目前的代码:
funcOne(target).funcTwo(x, y, z);
如何使用推荐的window[]();
方式调用此方法?为什么我不能用它?:
eval('funcOne(target).funcTwo(x, y, z)');
我不希望你多次问这个问题的烦恼,因为我现在想不出一种方法来调用一个叫做双重函数的方法。
提前致谢!
答案 0 :(得分:6)
在Javascript中,语法a.b
可以替换为a["b"]
。所以在你的情况下你可以使用
window["funcOne"](target)["funcTwo"](x, y, z);
当然,只有在使用变量而不是"funcOne"
和"funcTwo"
时才有意义。
如果所有内容都已修复,但您只是想延迟执行,则可以使用带有
的匿名闭包“thunking”x = function(){ return funcOne(target).funcTwo(x, y, z); };
然后您可以使用x()
进行评估,以便稍后获得所需的结果。
即使变量target
和x
,y
和z
对于封闭范围是本地的,最后一个示例也能正常工作,因为thunking闭包将“捕获”它们。
但是你应该注意这样一个事实,即在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中使用,所以最好知道并理解它。