为什么要使用(function(){....}());

时间:2012-06-26 14:45:28

标签: javascript

  

可能重复:
  How does the (function() {})() construct work and why do people use it?

为什么现代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技能,我理解上面列出的单个命令,但我不明白为什么它们包含在几个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));

3 个答案:

答案 0 :(得分:10)

这样做是为了使内部代码不会干扰全局范围内的变量。

例如:

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

现在,这两个都是全球性的。但是,我不希望这样。所以,如果我创建一个函数,我可以创建一个新的范围。

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

答案 1 :(得分:3)

它被称为闭包,它被设计为封装代码,以便不在全局范围内声明变量和函数,从而防止冲突。

答案 2 :(得分:2)

这样做是为了防止“污染全球范围”。通过使用匿名函数包围代码,变量仅存在于函数的范围内,从而防止了全局命名空间中可能的冲突。

需要外部括号,因为function(){}本身是一个声明,您需要通过在其前面添加(...)!将其转换为表达式才能执行它