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 技能,我理解上面列出的单个命令,但我不明白为什么它们会包含在几个functions. 我们不能打电话给:

    "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(){}它本身就是一个声明,您需要通过在其前面添加(...)or 和将其转换为表达式!才能执行它。

于 2012-06-26T14:47:15.193 回答