7

我有以下代码,想知道如何使最后一行工作。我添加了一组 api,将当前使用的 _view 附加为它的命名空间约定,并且宁愿使用 arc.view.$function_name 之类的东西。谢谢

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']();
4

3 回答 3

11
window['arc']['view']['say_hello']();

或者

window.arc.view.say_hello()

或者

window['arc'].view['say_hello']()

点语法或括号语法都可以使用。点语法实际上只是基于括号的属性查找的语法糖,因此上述所有代码片段都是相同的。当属性名称本身是动态值时使用括号语法,或者在点语法中使用属性名称会导致语法错误。例如:

var dynamicMethodName = someObject.getMethodName();
someOtherObject[dynamicMethodName]();

或者

someOtherObject["a key string with spaces and {special characters}"]();
于 2012-04-14T19:13:41.663 回答
3

试试这个

jsFiddle

window["arc"]["view"]["say_hello"]();
于 2012-04-14T19:14:16.727 回答
2

使用方括号表示法,您实际上是在要求执行 window 中的函数arc.view.say_hello,而不是对象中的函数view(即 object 的属性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");

您还可以扩展实用程序函数以使用arguments(或者您可以只返回对该函数的引用)。

于 2012-04-14T20:01:34.200 回答