pat*_*urs 2 javascript string eval window function
因此,我已经阅读了许多不同的方法,从字符串调用函数,使用window[]();和eval();.我想知道我的情况(即下面)是什么方法才是正确的方法,如果是的话,解释原因.还解释了为什么eval();不是一个很好的选择,很多人都说安全性,但如果你能获得任何能够让你更改该页面上的脚本的浏览器插件,为什么安全性会成为一个问题呢?(例如:firefox的firebug)
我目前的代码:
funcOne(target).funcTwo(x, y, z);
Run Code Online (Sandbox Code Playgroud)
如何使用推荐的window[]();方式调用此方法?为什么我不能用这个?:
eval('funcOne(target).funcTwo(x, y, z)');
Run Code Online (Sandbox Code Playgroud)
我不希望你多次问这个问题的烦恼,因为我现在想不出一种方法来调用一个叫做双重函数的方法.
提前致谢!
在Javascript中,语法a.b可以替换为a["b"].所以在你的情况下你可以使用
window["funcOne"](target)["funcTwo"](x, y, z);
Run Code Online (Sandbox Code Playgroud)
当然,只有当你使用变量而不是"funcOne"和时才有意义"funcTwo".
如果所有内容都已修复,但您只是想延迟执行,则可以使用带有匿名闭包的"thunking"
x = function(){ return funcOne(target).funcTwo(x, y, z); };
Run Code Online (Sandbox Code Playgroud)
然后你可以评估x()以便以后获得所需的结果.
最后一个例子即使变量target和也是正确的x,y并且z是封闭范围的本地,因为thunking闭包将"捕获"它们.
但是,你应该注意这样一个事实,即在Javascript中创建新作用域的唯一方法是使用一个函数(一个用C++和其他语言包围的块,{并且}不是像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);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我onclick在div上使用了一个闭包,但这不会起作用,因为所有这些函数都将使用相同的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);
}
Run Code Online (Sandbox Code Playgroud)
这样i,onclick处理程序内部的变量对于每个闭包都是不同的.
当你需要创建许多独立的闭包时,通常在Javascript中使用这种创建函数来立即调用它的模式,因此最好知道并理解它.
| 归档时间: |
|
| 查看次数: |
687 次 |
| 最近记录: |