可能重复:
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));
答案 0 :(得分:10)
这样做是为了使内部代码不会干扰全局范围内的变量。
例如:
var myLibrary = {};
var _privateVar = [];
现在,这两个都是全球性的。但是,我不希望这样。所以,如果我创建一个函数,我可以创建一个新的范围。
(function(){
window.myLibrary = {}; // global
var _privateVar = []; // private
}());
答案 1 :(得分:3)
它被称为闭包,它被设计为封装代码,以便不在全局范围内声明变量和函数,从而防止冲突。
答案 2 :(得分:2)
这样做是为了防止“污染全球范围”。通过使用匿名函数包围代码,变量仅存在于函数的范围内,从而防止了全局命名空间中可能的冲突。
需要外部括号,因为function(){}
本身是一个声明,您需要通过在其前面添加(...)
或!
将其转换为表达式才能执行它