7

次のコードがあり、最後の行を機能させる方法を考えています。私は、名前空間の規則として追加された _view を現在使用している api のセットを追加し、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

これを試してください

jsフィドル

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

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 に答える