我有以下代码,我想知道如何使最后一行工作。我添加了一组api,当前使用_view作为其命名空间约定附加,而宁愿使用像arc.view。$ function_name这样的东西。 THX
var arc={};
arc.view={
say_hello: function(){
alert("I want to say hello");
}
}
function say_goodbye(){
alert("goodbye to you");
}
arc.view.say_hello(); // works
window['say_goodbye'](); // works
// possible to make this work?
window['arc.view.say_hello']();
答案 0 :(得分:10)
window['arc']['view']['say_hello']();
或
window.arc.view.say_hello()
或
window['arc'].view['say_hello']()
点语法或括号语法都可以。 Dot语法实际上只是基于括号的属性查找的语法糖,因此所有上述代码片段都是相同的。当属性名称本身是动态值时使用括号语法,或者在点语法中使用属性名称会导致语法错误。 E.g:
var dynamicMethodName = someObject.getMethodName();
someOtherObject[dynamicMethodName]();
或
someOtherObject["a key string with spaces and {special characters}"]();
答案 1 :(得分:3)
答案 2 :(得分:2)
使用方括号表示法实际上要求在名为arc.view.say_hello
的窗口中执行函数,而不是对象view
中的函数(即对象{{1}的属性})。更明确一点:
arc
如果要以您描述的方式调用函数,则必须“解析”对象链。您可以为此创建实用程序功能。类似的东西:
window["arc.view.say_hello"] = function () { alert("hi") };
window["arc.view.say_hello"](); // "hi"
您还可以将效用函数扩展为使用var arc={};
arc.view={
say_hello: function(){
alert("I want to say hello");
}
}
function say_goodbye(){
alert("goodbye to you");
}
function call(id) {
var objects = id.split(".");
var obj = this;
for (var i = 0, len = objects.length; i < len && obj; i++)
obj = obj[objects[i]];
if (typeof obj === "function")
obj();
}
call("say_goodbye");
call("arc.view.say_hello");
(或者您可以只返回对该函数的引用)。