10

重複の可能性:
(function(){})()構文はどのように機能し、なぜ人々はそれを使用するのですか?

最新のJavaScriptファイルが次のような構造を使用するのはなぜですか。

(function () {
   // some real code
 }());

つまり、匿名関数が作成され、パラメータが渡されずにすぐに呼び出されることを理解しています...しかし、なぜこの方法で呼び出すだけでなく、呼び出すのsome real codeですか?そして、丸括弧の外側のペアは何のためのものですか?

特に、Githubでファイルjs/start.jsを見つめています。

(function() {
    "use strict";

    wooga.castle.GRID_UNIT = 48;
    wooga.castle.IMAGES_BASE_URL = "images/entities/";

    (function () {
        var style = document.createElement('div').style,
            prefix;
        var candidates = {
            webkit: 'webkitTransform',
            moz:    'MozTransform', // 'M' is uppercased
            ms:     'msTransform',
            o:      'oTransform',
            '':     'transform'
        };
        for (var prefix in candidates) {
            var candidate = candidates[prefix];
            if ('undefined' !== typeof style[candidate]) {
                wooga.castle.prefix = prefix;
                wooga.castle.prefixedTransform = candidate;
                break;
            }
        }
    }());

    // XXX why the 2 wrapped "function"s here? XXX

    wooga.castle.isNativeWrapper = function() {
        var result = !wooga.castle.capabilities.desktop && !wooga.castle.capabilities.android && (! /Safari/.test(navigator.userAgent));
        wooga.castle.isNativeWrapper = function () {
            return result;
        };
        return result;
    };
}());

基本的なJavaScriptとjQueryのスキルで、上記の1つのコマンドは理解できますが、なぜそれらがいくつかのコマンドにラップされているのかわかりませんfunction。ただ呼び出すことはできません:

    "use strict";

    wooga.castle.GRID_UNIT = 48;
    wooga.castle.IMAGES_BASE_URL = "images/entities/";
    var style = document.createElement('div').style,
        prefix;
    var candidates = {
        webkit: 'webkitTransform',
        moz:    'MozTransform', // 'M' is uppercased
        ms:     'msTransform',
        o:      'oTransform',
        '':     'transform'
    };
    for (var prefix in candidates) {
        var candidate = candidates[prefix];
        if ('undefined' !== typeof style[candidate]) {
            wooga.castle.prefix = prefix;
            wooga.castle.prefixedTransform = candidate;
            break;
        }
    }

    wooga.castle.isNativeWrapper = !wooga.castle.capabilities.desktop && !wooga.castle.capabilities.android && (! /Safari/.test(navigator.userAgent));
4

3 に答える 3

11

これは、内部のコードがグローバルスコープの変数に干渉しないようにするために行われます。

例えば:

var myLibrary = {};
var _privateVar = [];

現在、これらは両方ともグローバルです。しかし、私はそれを望んでいません。したがって、関数を作成すると、新しいスコープを作成できます。

(function(){
    window.myLibrary = {}; // global
    var _privateVar = []; // private
}());
于 2012-06-26T14:48:19.583 に答える
3

これはクロージャと呼ばれ、変数と関数がグローバルスコープで宣言されないようにコードをカプセル化するように設計されており、競合を防ぎます。

于 2012-06-26T14:47:05.973 に答える
2

これは、「グローバルスコープの汚染」を防ぐために行われます。コードを無名関数で囲むことにより、変数は関数のスコープ内にのみ存在し、グローバル名前空間で発生する可能性のある競合を防ぎます。

外側の角かっこは、それ自体が宣言であり、実行するにはその前にまたはをfunction(){}追加して式に変換する必要があるため、必要です。(...)!

于 2012-06-26T14:47:15.193 に答える