在javascript中动态调用本地函数
有很多类似的问题都是关于动态调用函数名称的。 然而,我无法找到解决方案,我的具体问题是在闭包内部有本地函数而没有将函数暴露给对象的公共接口。
让我们看看一些代码(这是一个虚构的例子)...
(function(window,$) {
MyObject = (function($) {
var obj = {};
obj.publicMethod = function(number,otherarg) {
this['privateMethod'+number].apply(this,[otherarg]);
};
var privateMethod1 = function(arg) {
//do something with arg
};
var privateMethod2 = function(arg) {
//do something else with arg
};
return obj;
})($);
window.MyObject = MyObject;
})(window,jQuery);
这是行不通的,因为“this”是MyObject,并且本地函数没有公开。 另外,我希望能够在尝试调用它之前检查函数是否存在。 例如。
var func_name = 'privateMethod'+number;
if($.isFunction(this[func_name])) {
this[func_name].apply(this,[otherarg]);
}
我并不确定如何继续,但我的私人功能暴露在公共界面之外,这一切都有效。
obj.privateMethod1 = function(arg) {
//do something with arg
};
obj.privateMethod2 = function(arg) {
//do something else with arg
};
我正在用尽想法。 非常感谢您的帮助和建议。
您无法通过字符串获取对局部变量的引用。 您必须将本地对象添加到名称空间中:
(function(window,$) {
// Use "var MyObject = " instead of "MyObject = "!! Otherwise, you're assigning
// the object to the closest parent declaration of MyVar, instead of locally!
var MyObject = (function($) {
var obj = {};
var local = {}; // <-- Local namespace
obj.publicMethod = function(number,otherarg) {
local['privateMethod'+number].call(this, otherarg);
};
var privateMethod1 = local.privateMethod1 = function(arg) {
//do something with arg
};
var privateMethod2 = local.privateMethod2 = function(arg) {
//do something else with arg
};
return obj;
})($);
window.MyObject = MyObject;
})(window,jQuery);
私有函数是局部变量,不是任何对象的一部分。 因此, [...]
记法访问属性是从来没有去上班,因为没有对象的私有函数的性质。
相反,您可以创建两个对象: private
和public
:
var public = {},
private = {};
public.publicMethod = function(number, otherarg) {
// `.apply` with a fixed array can be replaced with `.call`
private['privateMethod' + number].call(this, otherarg);
};
private.privateMethod1 = function(arg) {
//do something with arg
};
private.privateMethod2 = function(arg) {
//do something else with arg
};
return public; // expose public, but not private
我很惊讶,不正确的答案被标记为接受。 其实你可以通过一个字符串来获得一个局部变量的引用。 只需使用eval
:
(function(window,$) {
MyObject = (function($) {
var obj = {};
obj.publicMethod = function(number,otherarg) {
// Gets reference to a local variable
var method = eval('privateMethod'+number);
// Do with it whatever you want
method.apply(this,[otherarg]);
};
var privateMethod1 = function(arg) {
//do something with arg
};
var privateMethod2 = function(arg) {
//do something else with arg
};
return obj;
})($);
window.MyObject = MyObject;
})(window,jQuery);
其实这段代码非常糟糕,在99.9%的情况下你不应该使用eval
。 但是你必须知道它是如何工作的以及你可以用它做什么。 当我需要使用eval
时,我自己有一些非常特殊的情况。