简单。看起来很正常,几乎令人欣慰:
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;
}
}
)();
因此,在您阅读的大多数教程中,您现在会被“匿名自执行”或类似术语轰炸。
经过多年的专业发展,我强烈敦促您为您编写的每个函数命名以进行调试。
当出现问题时(并且会出现问题),您将在浏览器中检查回溯。当堆栈跟踪中的条目有名称时,总是更容易缩小代码问题的范围!
非常啰嗦,希望对您有所帮助!