10

グローバル オブジェクトの使用は推奨されておらず、AMD を使用する背後にある全体的な考え方は、グローバル オブジェクトの使用を避けることです。しかし、一部のレガシー コードでは、グローバル オブジェクトでいくつかのものを定義する必要があります。現在、コードは次のようになっています。

//example2.js
define(function(){
  var globalObject = window;
  globalObject.x = ...
  globalObject.y = ...
});

それは機能しますが、グローバル オブジェクトをハード コーディングするのwindowは見栄えがよくないので、それを削除できるかどうかを知りたいと思っています。を使用しない場合define()、コードは次のようになります。

//example1.js
x = ...
y = ...

私は知っています、私はあなたがこのコードを嫌っていることを知っていますが、ポイントにしましょう: グローバル変数はdefine()、requirejs の関数内で構造化された方法でどのようにアクセスできますか? 次のように渡される関数への最後の隠しパラメーターのようなものがあればいいのにと思いますdefine()

//example3.js
define(function(globalObject){
  globalObject.x = ...
  globalObject.y = ...
});

または、さらに単純です。this変数は、その関数内のグローバル オブジェクトを指します。例えば:

//example4.js
define(function(){
  this.x = ...
  this.y = ...
});

注:この最後のものについてはわかりません。thisに渡される関数内の変数を調査するrequire()と、それはwindow私の質問への答えになる可能性があると言われていますが、渡された関数が実行されているコンテキストについて言及しているドキュメントを見つけることができませんでした。結局のところ、グローバル変数のコンテキストで実行されているのでしょうか?

4

3 に答える 3

15

オブジェクトを返すモジュールを作成することをお勧めしますwindow。これは、単体テストの目的 (依存関係のモック) に特に役立ちます。

window.js

define(function(){
   return window;
});

app.js

define(['window'], function(win) {
  // Manipulate window properties
  win.foo = 1;  
  console.log(win.foo);      
});
于 2014-09-16T09:23:08.253 に答える
5

厳密モードでも機能する@TJCrowderの回答のバリエーション:

(function(global) {
    define(function() {

        global.a="this";
        global.b="that";

    });
})(this);

すぐに呼び出される関数を引数 'this' (関数の外側はグローバル スコープ) で呼び出すと、グローバル スコープが何であれ、引数 'global' として IIF に渡されます。

これにより、「window」オブジェクトへのハードコーディングも回避されます。これは、ブラウザ以外の環境では適用されないため、利点です。

于 2015-05-06T05:58:01.803 に答える
5

厳密モードでない場合は、次のようにできます。

(function() {
  var global = this;

  define(function(){
    global.x = ...
    global.y = ...
  });
})();

すぐに呼び出す外側の匿名関数は、特定の特別なthis値なしで呼び出されるため、(これは厳密モードではないため) としてグローバル オブジェクトを受け取りますthis。(strict モードでは、undefined代わりに receive になります。) したがって、無名関数内のthis変数 ( ) を取得し、渡す関数からそれを使用します(これはそれを閉じます)。globaldefine

于 2013-03-16T10:40:54.133 に答える