Подтвердить что ты не робот

Зачем использовать (function() {....}());

Возможный дубликат:
Как работает конструктор (function() {})() и почему люди его используют?

Почему в современных файлах JavaScript используются такие конструкции, как:

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

т.е. Я понимаю, что анонимная функция создается, а затем вызывается немедленно, без каких-либо параметров... Но зачем это делать так, а не просто вызывать some real code? И какова внешняя пара круглых скобок для?

В частности, я смотрю на файл js/start.js в Github:

(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 я понимаю одиночные команды, перечисленные выше, но я не понимаю, почему они обернуты внутри нескольких function s. Не можем ли мы просто позвонить:

    "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));
4b9b3361

Ответ 1

Это делается для того, чтобы внутренний код не мешал переменным в глобальной области.

Например:

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

Теперь они оба являются глобальными. Но я не хочу этого. Итак, если я создаю функцию, я могу создать новую область.

(function(){
    window.myLibrary = {}; // global
    var _privateVar = []; // private
}());

Ответ 2

Он называется закрытием, он предназначен для инкапсуляции кода, чтобы переменные и функции не объявлялись в глобальной области, предотвращая конфликты.

Ответ 3

Это делается для предотвращения "Загрязнения глобального масштаба". Окружая код анонимной функцией, переменные существуют только в объеме функции, что предотвращает возможные конфликты в глобальном пространстве имен.

Внешние скобки необходимы, потому что function(){} сам является объявлением, и вам нужно включить его в выражение, добавив перед ним (...) или или !, чтобы выполнить его.