在javascript中,什么时候你想使用这个:
(function(){
//Bunch of code...
})();
在这:
//Bunch of code...
在javascript中,什么时候你想使用这个:
(function(){
//Bunch of code...
})();
在这:
//Bunch of code...
当前回答
看起来这个问题已经有了答案,但我还是会发表我的意见。
我知道什么时候我喜欢使用自动执行函数。
var myObject = {
childObject: new function(){
// bunch of code
},
objVar1: <value>,
objVar2: <value>
}
该函数允许我使用一些额外的代码来定义childObjects的属性和属性,以获得更清晰的代码,例如设置常用的变量或执行数学方程;哦!或者错误检查。而不是局限于嵌套的对象实例化语法…
object: {
childObject: {
childObject: {<value>, <value>, <value>}
},
objVar1: <value>,
objVar2: <value>
}
一般来说,编码有很多晦涩的方法来做很多相同的事情,这让你想知道,“为什么要麻烦呢?”但是新的情况不断出现,您不能再仅仅依赖基本/核心原则。
其他回答
由于Javascript中的函数是一等对象,通过这样定义它,它有效地定义了一个类似于c++或c#的“类”。
该函数可以定义局部变量,并在其中包含函数。内部函数(实际上是实例方法)可以访问局部变量(实际上是实例变量),但它们将与脚本的其余部分隔离。
我已经看了所有的答案,这里少了一些很重要的东西,我要KISS。有两个主要原因,为什么我需要自执行匿名函数,或者更好地说“立即调用函数表达式(IIFE)”:
更好的命名空间管理(避免命名空间污染-> JS模块) 闭包(模拟私有类成员,如OOP所示)
第一个已经解释得很好了。对于第二个问题,请学习下面的例子:
var MyClosureObject = (function (){
var MyName = 'Michael Jackson RIP';
return {
getMyName: function () { return MyName;},
setMyName: function (name) { MyName = name}
}
}());
注意1:我们不是将函数赋值给MyClosureObject,而是调用该函数的结果。注意最后一行中的()。
注意2:关于Javascript中的函数,你还需要知道的是,内部函数可以访问函数的参数和变量,它们是在函数内部定义的。
让我们做一些实验:
我可以得到MyName使用getMyName,它工作:
console.log(MyClosureObject.getMyName());
// Michael Jackson RIP
下面这种简单的方法是行不通的:
console.log(MyClosureObject.MyName);
// undefined
但我可以设置另一个名称,并获得预期的结果:
MyClosureObject.setMyName('George Michael RIP');
console.log(MyClosureObject.getMyName());
// George Michael RIP
编辑:在上面的例子中,MyClosureObject被设计为不使用newprefix,因此按照惯例它不应该大写。
自执行函数用于管理变量的作用域。
变量的作用域是程序中定义变量的区域。
全局变量具有全局作用域;它在JavaScript代码中的任何地方都有定义,并且可以从脚本中的任何地方访问,甚至在函数中。另一方面,在函数中声明的变量只能在函数体中定义。 它们是局部变量,具有局部作用域,并且只能在该函数中访问。函数参数也算作局部变量,只在函数体中定义。
如下所示,您可以在函数中访问全局变量变量,并注意在函数体中,具有相同名称的局部变量优先于全局变量。
var globalvar = "globalvar"; // this var can be accessed anywhere within the script
function scope() {
alert(globalvar);
var localvar = "localvar"; //can only be accessed within the function scope
}
scope();
因此,基本上,自执行函数允许编写代码,而无需考虑其他javascript代码块中的变量如何命名。
自我调用(也称为 自动调用)是当一个函数 立即执行 定义。这是一个核心模式 它是许多人的基础 JavaScript的其他模式 发展。
我是它的超级粉丝:)因为:
它使代码减至最少 它实现了行为与表示的分离 它提供了一个闭包,可以防止命名冲突
(为什么你要说它是好的?)
它是关于一次定义和执行一个函数。 你可以让这个自动执行的函数返回一个值,并将该函数作为参数传递给另一个函数。 它有利于封装。 它也适用于块作用域。 是的,你可以把你所有的.js文件封装在一个自动执行的函数中,并且可以防止全局命名空间污染。;)
更多的在这里。
可能是范围隔离。这样函数声明中的变量就不会污染外部命名空间。
当然,在一半的JS实现中,它们都是如此。