3 回答
TA贡献1801条经验 获得超8个赞
简单化。看起来很正常,几乎让人感到安慰:
var userName = "Sean";console.log(name());function name() { return userName;}
然而。如果我在页面中包含一个非常方便的javascript库,将高级字符转换为基本级别表示,该怎么办?
等等......什么?
我的意思是。如果有人输入带有某种重音的角色(例如法语或西班牙语),但我只想要'英语'字符?Az在我的节目中?嗯......西班牙语'n~'和法语'e /'字符(我已经为这些字符使用了两个字符,但你可以在表达重音的字符中进行精神跳跃),这些字符可以被翻译成为'n'和'e'的基本字符。
所以有一个好人已经写了一个全面的字符转换器,我可以包括在我的网站...我包括它。
一个问题:它有一个名为'name'的函数,与我的函数相同。
这就是所谓的碰撞。我们在相同的范围内声明了两个具有相同名称的函数。我们想避免这种情况。
所以我们需要以某种方式确定代码的范围。
在javascript中扩展代码范围的唯一方法是将其包装在函数中:
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; }}
这可能会解决我们的问题。现在所有东西都是封闭的,只能在我们的开启和关闭支架内进行访问。
我们在函数中有一个函数......这看起来很奇怪,但完全合法。
只有一个问题。我们的代码不起作用。我们的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; } })();
因此,在您阅读的大多数教程中,您现在将使用“匿名自执行”或类似的术语进行轰炸。
经过多年的专业开发,我强烈建议您为调试目的命名您编写的每个函数。
当出现问题时(它会出现问题),您将在浏览器中检查回溯。它总是更容易缩小你的代码的问题时,在堆栈跟踪中的条目有名字!
非常啰嗦,我希望它有所帮助!
添加回答
举报