我在变量中有一个函数的名称,但是一切都在一个闭包中。有了这个变量,我想调用这个函数,就像这样
(function(func) {
this[func]() ; // doesn't work
function bar() {}
function foo() {}
})('bar') ;
这样的事情是可能的,或者我应该将函数添加到变量中,例如
(function(func) {
var ns = {
bar: function() {},
foo: function() {}
};
ns[func]() ; // OK
})('bar') ;
答案 0 :(得分:10)
使用[]
语法无法通过名称访问当前词法作用域中声明的变量和函数 - 只能根据另一个变量的内容动态查找属性键(根据您的第二个示例)。
解决这个问题的唯一方法是诉诸eval
,这几乎不是一个好主意。
异常适用于在全局范围内声明的变量和函数 - 这些实际上是window
的属性。
答案 1 :(得分:1)
这样的事情:
(new function() {
this.a = function(x) {
document.getElementById('out').innerHTML += x;
}
})['a']('boom.');
封闭使一切都保密。通常,闭包中的this
仅指window
。但是,您可以通过首先将其转换为匿名对象来“公开”“闭包”中的项目而不会污染全局空间。这允许您在对象消失之前对对象进行一次且只有一次方法调用...
您可以执行普通的对象操作,例如使用私有,词法变量并仅公开您想要公开的方法。
(new function() {
var a = function(x) { document.getElementById('out').innerHTML += x; }
var b = function() { a(d); }
var c = function() { /* ... */ }
var d = "whatever";
// expose two of them ..
this.a = a;
this.b = b;
})['a']('boom.');
答案 2 :(得分:1)
根据我的经验,在闭包中放置一个函数是将其声明为“私有”的一种方式 - 这样外面的任何东西都无法访问它。此外,值得研究代码缩小的方式:
在:
(function() {
function privateFn(var1, var2) {
//TODO
}
return {
publicFn: function() { }
}
})();
后:
(function() {
function _a(_0, _1) {
}
return {
publicFn: function() { }
}
})();
注意privateFn
如何不再存在?根据语言的定义,minifier知道没有任何东西可以通过名称或其他方式访问该函数。你似乎想把你的一个职能公之于众。