JavaScript中自我执行函数的目的是什么?
在javascript中,你什么时候想使用它:
(function(){
//Bunch of code...
})();
在此之上:
//Bunch of code...
在javascript中,你什么时候想使用它:
(function(){
//Bunch of code...
})();
在此之上:
//Bunch of code...
这一切都与变量范围有关。默认情况下,在自执行函数中声明的变量仅可用于自执行函数中的代码。这允许在编写代码时不考虑变量在其他 JavaScript 代码块中的命名方式。
例如,正如亚历山大在评论中提到的:
(function() {
var foo = 3;
console.log(foo);
})();
console.log(foo);
这将首先记录,然后在下一个上抛出错误,因为未定义。3
console.log
foo
简单。所以看起来很正常,它几乎令人欣慰:
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()函数。
现在我们来看看自动执行函数(或自执行,自运行,随便什么)。
((){})();
语法很尴尬,就像罪恶一样。但是,它有效。
当您将函数定义括在括号中,并包含参数列表(另一个集合或括号!)时,它充当函数调用。
因此,让我们再次看一下我们的代码,使用一些自执行的语法:
(function main() {
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
)();
因此,在您阅读的大多数教程中,您现在都会受到“匿名自我执行”或类似术语的轰炸。
经过多年的专业发展,我强烈建议您为调试目的而编写每个函数。
当出现问题时(它会出错),您将在浏览器中检查回溯。当堆栈跟踪中的条目具有名称时,缩小代码问题的范围总是更容易!
非常冗长,我希望它有帮助!