3

私のプロジェクトは通常、次のようなショートカット変数を使用するため、これを行いたいです。

(function() {
    var world = new World(),
        Event = world.Event,
        Guide = world.Guide;

    Event.add('updateUI', function() {
        // 1st: Correct, the value of 'this' refers to a world
        this.Guide.show('UI updated');
        // 2nd: Ok because 'world' was defined in outer scope
        world.Guide.show('UI updated');
        // 3rd: Ok because 'Guide' was defined in outer scope
        Guide.show('UI updated');
    });
})();

他のファイルに移動Event.add('updateUI', function() { ... });すると、最初のステートメント ( this.Guide.show) のみが機能します。2 番目と 3 番目のステートメントが最初からエラーをスローするように、この関数が外部スコープの変数worldまたは変数を使用しないようにするにはどうすればよいですか。Guide

use strictこれに非常に近いですが、グローバル オブジェクトにアクセスできなくなるだけです。

この質問をより明確にするために更新されました。主な質問は次のとおりです。関数が外部スコープで変数を検索しないようにする方法はありますか? 方法がない場合は、その理由を説明してください。これを行う必要性は合理的だと思います。

4

2 に答える 2

2

シャドウイングを使用できます。関数内で変数を明示的に宣言する (初期化しない) 場合、関数は、外部スコープからの同じ名前の変数の代わりに、この変数を使用します。

例:

var outer = 'foo';

function isolated () {
  var outer;
  console.log(outer);
};

isolated(); // output undefined

これはあなたのニーズをカバーするはずです。

別の方法もありますが、これは見苦しいハックであり、一部のブラウザー (IE ?) では機能しない可能性があります。

次に例を示します。

var outer = 'foo';

function isolated () {
  console.log(outer);
};

var e = eval;
// will throw exception: 'outer' is not defined
console.log(e('('+isolated.toString()+')()'));

evaleまったく同じではありません。「真」の評価はスコープ全体にアクセスできますが、それをコピーすると、評価されたコードで外側のスコープを使用できないようにすることで、JavaScript エンジンが最適化できます。

ただし:そうしないでください

  • まず、 function.toString() が関数のコードを出力するという事実に依存しています。これは仕様の一部ではないため、信頼できません (ただし、v8 と Spidermonkey では動作します)。
  • 2 つ目:eval回避する必要があります。デバッグは悪夢になり (便利なスタック トレースにアクセスできません)、パフォーマンスとセキュリティの問題があり、すぐにひどいコードを維持することになります。
于 2013-12-23T08:00:43.027 に答える
0

なぜこれをしたいのかわかりませんが、短い例を使用してください:

(function(theFunk) {
    var world = new World(),
        Event = world.Event,
        Guide = world.Guide;

    Event.add('updateUI',theFunk);

})(function(){
        this.Guide.show('UI updated');  // 1st: depends on what you do with it
        world.Guide.show('UI updated'); // 2nd: will fail (depends on global)
        Guide.show('UI updated');       // 3rd: will fail (depends on global)
});
于 2013-10-28T04:55:46.183 に答える