javascript调用window对象的函数

时间:2012-04-14 19:06:54

标签: javascript jquery

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

3 个答案:

答案 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)

试试这个

jsFiddle

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

答案 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"); (或者您可以只返回对该函数的引用)。