在javascript中,什么时候你想使用这个:
(function(){
//Bunch of code...
})();
在这:
//Bunch of code...
在javascript中,什么时候你想使用这个:
(function(){
//Bunch of code...
})();
在这:
//Bunch of code...
当前回答
IIRC允许你创建私有属性和方法。
其他回答
(function(){
var foo = {
name: 'bob'
};
console.log(foo.name); // bob
})();
console.log(foo.name); // Reference error
实际上,上面的函数将被视为没有名称的函数表达式。
用左右圆括号包装函数的主要目的是避免污染全局空间。
函数表达式中的变量和函数变成私有的(也就是说,它们在函数外部是不可用的)。
由于Javascript中的函数是一等对象,通过这样定义它,它有效地定义了一个类似于c++或c#的“类”。
该函数可以定义局部变量,并在其中包含函数。内部函数(实际上是实例方法)可以访问局部变量(实际上是实例变量),但它们将与脚本的其余部分隔离。
此方法用于闭包。有关闭包的更多信息,请阅读此链接。
自调用函数在javascript:
自动调用(启动)自调用表达式,而不需要调用。自调用表达式在创建后立即被调用。这主要用于避免命名冲突以及实现封装。变量或声明的对象在此函数之外不可访问。为了避免最小化(filename.min)的问题,总是使用自执行函数。
简单。所以看起来很正常,几乎令人欣慰:
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
但是,如果我在我的页面中包含一个非常方便的javascript库,它可以将高级字符转换为基本级别表示呢?
等待……什么?
我的意思是,如果有人输入一个带有某种口音的字符,但我只想在我的程序中输入“英语”字符a - z ?嗯…西班牙语的“ñ”和法语的“é”可以翻译成基本字符“n”和“e”。
所以有人写了一个全面的字符转换器,我可以包括在我的网站…我把它包括在内。
有一个问题:它有一个名为“name”的函数,与我的函数相同。
这就是所谓的碰撞。我们在同一个作用域中声明了两个同名的函数。我们要避免这种情况。
因此,我们需要以某种方式确定代码的范围。
在javascript中作用域代码的唯一方法是将其包装在函数中:
function main() {
// We are now in our own sound-proofed room and the
// character-converter library's name() function can exist at the
// same time as ours.
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
那也许能解决我们的问题。现在所有内容都是封闭的,只能从开括号和闭括号内访问。
我们有一个函数中的一个函数。看起来很奇怪,但完全合法。
只有一个问题。我们的代码不能工作。 我们的userName变量从来没有回显到控制台!
我们可以通过在现有代码块之后添加对函数的调用来解决这个问题…
function main() {
// We are now in our own sound-proofed room and the
// character-converter libarary's name() function can exist at the
// same time as ours.
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
main();
或之前!
main();
function main() {
// We are now in our own sound-proofed room and the
// character-converter libarary's name() function can exist at the
// same time as ours.
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
第二个问题是:“main”这个名字还没有被使用的可能性有多大?...非常非常苗条。
我们需要更多的范围。以及自动执行main()函数的方法。
现在我们来讨论自动执行函数(或自动执行、自动运行等等)。
((){})();
语法非常笨拙。然而,它是有效的。
当你用圆括号包装一个函数定义,并包含一个形参列表(另一个集合或圆括号!),它就像一个函数调用。
所以让我们再看看我们的代码,使用一些自动执行的语法:
(function main() {
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
)();
所以,在你阅读的大多数教程中,你现在都会被“匿名自动执行”或类似的术语轰炸。
经过多年的专业开发,我强烈建议您为调试目的而编写的每个函数都命名。
当出现错误时(它会出错),您将在浏览器中检查回溯。当堆栈跟踪中的条目有名称时,总是更容易缩小您的代码问题!