2

以下に示すように、ラップされた Javascript クロージャーの最初と最後に渡される引数の役割をどのように説明すればよいですか?

(function($, window) {
  return $(function() {
    return alert("js!");
  });
})($, window);
4

5 に答える 5

5

最初の出現は関数パラメーターで、2 番目は関数の実行時にそれらのパラメーターの値を渡します。

関数へのパラメーターは、渡される名前と一致する必要はないことに注意してください (実際、これは後で混乱を招く可能性があります)。

(function(jQuery, w) {
    return jQuery(function(){
        return alert("js!");
    });
})($, window);

同じように動作します。

于 2012-11-14T19:51:14.980 に答える
1

そのようにして、将来の上書きからスコープ内で安全な引数を渡します。例えば:

var a = 1
(function(a){
    setTimeout(function(){
        console.log('This variable is still safe', a);
    },2000)
})(a)
a = 0
console.log('has changed', a)

したがって、あなたの例では、 $ と window が期待どおりであることを確認できます。

于 2012-11-14T19:58:10.967 に答える
1

引数名を変えて関数名をつけると説明しやすいかもしれません

(function init($, win) {
  return $(function() {
    return alert("js!");
  });
})(jQuery, window);

init 関数にパラメーターが渡され、定義されるjQuerywindowすぐに、init 関数の引数として使用できます$win

同等のコードに分解すると、それも理解しやすいかもしれません

function init($, win) {
  return $(function() {
    return alert("js!");
  });
}
init(jQuery, window);
于 2012-11-14T19:54:11.783 に答える
0

上部のパラメーターのセットはパラメーターが受信される場所であり、下部のパラメーターのセットはパラメーターが渡される場所です。

彼らは、グローバル変数のクローズド コピーがクロージャーの外で再割り当てされないようにしています。これは、コードを他の (不適切に記述されている可能性がある) コードから保護する方法です。次の例を検討してください。

var $ = 'foo';

var blah = (function($) {
    return function () {
        alert($);
    };
})($);

var shizzam = (function() {
    return function () {
        alert($);
    };
})();

// someone evil overwrites my $ var
$ = 'bar';

// blah still works
blah();
// but shizzam is now borked
shizzam();

http://jsfiddle.net/xfTcq/

于 2012-11-14T19:57:22.673 に答える
0

関数が別の関数を返す場合、括弧で囲んですぐに実行することができます。最後の括弧は、渡された引数です。

理解できるいくつかのテストを実行できます。

var a (function(){});
typeof a;
a.toSource()

typeof (function(){});
(function(){}).toSource()
于 2012-11-14T19:58:01.103 に答える