简单。看起来很正常,几乎很舒服:
var userName=“Sean”;console.log(名称());函数名(){return userName;}
然而,如果我在我的页面中包含一个真正方便的javascript库,可以将高级字符转换为它们的底层表示,那会怎么样?
等待。。。什么?
我的意思是,如果有人键入带有某种重音的字符,但我只想在我的程序中使用“英语”字符a-Z?好。。。西班牙语的“ñ”和法语的“é”字符可以翻译成基本字符“n”和“e”。
所以有个好人写了一个全面的字符转换器,我可以把它放在我的网站上。。。我把它包括在内。
有一个问题:它有一个名为“name”的函数,与我的函数相同。
这就是所谓的碰撞。我们在同一个函数中声明了两个函数范围具有相同的名称。我们希望避免这种情况。
因此,我们需要以某种方式确定代码的范围。
在javascript中限定代码范围的唯一方法是将其包装在函数中:
函数main(){//我们现在在自己的隔音房间里//字符转换器库的name()函数可以存在于//和我们的时间一样。var userName=“Sean”;console.log(名称());函数名(){return userName;}}
这可能解决我们的问题。所有内容都已封闭,只能从左大括号和右大括号中访问。
我们在函数中有一个函数。。。看起来很奇怪,但完全合法。
只有一个问题。我们的代码不起作用。我们的用户名
变量永远不会回显到控制台中!
我们可以通过在现有代码块之后添加对函数的调用来解决此问题。。。
函数main(){//我们现在在自己的隔音房间里//字符转换器库的name()函数可以存在于//和我们的时间一样。var userName=“Sean”;console.log(name());函数名(){return userName;}}main();
或者之前!
main();函数main(){//我们现在在自己的隔音房间里//字符转换器库的name()函数可以存在于//和我们的时间一样。var userName=“Sean”;console.log(名称());函数名(){return userName;}}
第二个问题:“main”这个名字还没有被使用的可能性有多大。。。非常非常苗条。
我们需要更多的范围界定。以及一些自动执行main()函数的方法。
现在我们来谈谈自动执行功能(或自我执行、自我运行等)。
((){})();
语法很难理解。然而,它是有效的。
当您将函数定义括在括号中并包含参数列表(另一组或多个括号!)时,它将充当函数呼叫.
因此,让我们用一些自执行语法再次查看我们的代码:
(函数main(){var userName=“Sean”;console.log(名称());函数名称(){return userName;}})();
所以,在你阅读的大多数教程中,你现在都会被“匿名自我执行”或类似的术语轰炸。
经过多年的专业发展,我强烈地敦促你说出您编写的每个函数用于调试目的。
当出现问题时(它会出现),您将在浏览器中检查回溯。它是总是当堆栈跟踪中的条目具有名称时,更容易缩小代码问题的范围!