JavaScript调用window对象上的函数

8

我有以下代码,想知道如何使最后一行起作用。我采用了一组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']();

2
因为有你,我才能以成功结束整个充满挑战的一天...谢谢 +1 - vikas devde
3个回答

12
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}"]();

3
尝试一下这个:

jsFiddle

window["arc"]["view"]["say_hello"]();

2
使用方括号表示法,实际上是在请求执行window中名为arc.view.say_hello的函数,而不是对象arc的属性之一view中的函数。更明确地说:
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(或您可以仅返回对函数的引用)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接