我正在阅读这本书secrets of the js ninja
,而且我经常看到这样的代码
(function(){
something here;
})();
为什么我们需要将函数括在括号中,为什么我们之后再添加一对括号?
答案 0 :(得分:4)
它是一个自我调用函数,在脚本完成加载时调用它自己。您可以不带参数调用它,也可以添加参数,例如window
或document
。
您以jQuery使用它的方式使用它:
(function( window, undefined ) {
// jQuery code
})(window);
执行相同操作的(几乎)替代语法:
! function( window, undefined ){
// some code…
}(window);
阅读详情:http://sarfraznawaz.wordpress.com/2012/01/26/javascript-self-invoking-functions/
答案 1 :(得分:4)
这个
(function(){
alert('hello');
})();
虽然它是一个功能,它会自动调用,所以你不能/不能手动调用它
这些对于像这样的for
循环非常有用
这将失败,因为我将在5秒后等于9
for(var i = 0; i < 10; i++) {
window.setTimeout(function(){
console.log(i);
}, 5000)
}
所以你可以这样做
for(var i = 0; i < 10; i++) {
(function(a){
window.setTimeout(function(){
console.log(a);
}, 5000)
})(i);
}
也适合创建像这样的“私人”范围
(function(){
var test = 'hello';
console.log( test ); // 'hello'
}());
console.log( test ); // 'undefined'
答案 2 :(得分:2)
最后一组括号使该函数立即执行。无需在任何地方分配功能即可创建和执行功能。可能将代码包装在这样的函数中的原因是封装代码。以此为例:
var myVar = 'whatever';
function shout() { alert(myVar); }
此处,myVar
和shout
刚刚成为全局变量。您可以打开控制台并输入window.myVar
或window.shout
,然后您就可以访问和更改这些变量了。通过将其包装在函数中,这些变量保持在外部函数的本地:
(function() {
var myVar = 'whatever';
function shout() { alert(myVar); }
})();
window.myVar
和window.shout
未定义。唯一存在于该函数内部。
该模式还用于创建局部变量周围的闭包。请参阅JavaScript closure inside loops – simple practical example。
答案 3 :(得分:0)
自我调用功能,基本上它会自行调用。
通常用于传递jQuery之类的变量,以确保$
真正是jQuery对象!
(function($){
// $ now is equal to jQuery
})(jQuery);
答案 4 :(得分:0)
它运行您刚刚创建的功能。这样做的原因是它包含了您在新范围内编写的所有代码。这意味着当您定义vars
和functions
时,它们将保留在您刚创建的function()
范围内。
简而言之,它封装了代码。