|
|
1
181
这既不是范围问题,也不是闭包问题。问题在于 和 表达 JavaScript代码,即使是Netscape的第一个JavaScript版本和微软的第一个JavaScript副本,也是分两个阶段处理的: 阶段1:编译-在此阶段,代码被编译成语法树(字节码或二进制代码取决于引擎)。
函数的语法 是:
但是JavaScript还允许您使用 表达 . 函数表达式的语法与函数声明类似,只是它们是在表达式上下文中编写的。表达式为:
表达 声明 因此,要澄清:
第一阶段:编译。编译器看到变量
第二阶段:执行。解释器看到您想要传递变量
第一阶段:编译。编译器看到您正在声明一个名为someFunction的函数,因此它创建了它。
阶段2:翻译看到你想通过
第二阶段:执行。解释器将一个匿名函数传递给setTimeout,以便稍后执行。在这个函数中,它看到您正在使用变量
你可能想知道为什么
|
|
|
2
2
Javascript的作用域是基于函数的,而不是严格的词法作用域。也就是说
|
|
|
3
1
因为
someFunction3可能看起来类似于一个案例,但是由于您传递的是函数包装
|
|
|
4
1
这听起来像是遵循良好程序避免麻烦的一个基本案例。在使用变量和函数之前声明它们,并声明如下所示的函数:
避免用var声明它们。这只是草率的,会导致问题。如果你养成了在使用前声明一切的习惯,你的大部分问题都会很快消失。当声明变量时,我会立即用一个有效的值初始化它们,以确保没有一个变量是未定义的。我还倾向于包含在函数使用全局变量之前检查其有效值的代码。这是防止错误的额外保护措施。 所有这些工作的技术细节有点像你玩手榴弹时手榴弹的工作原理。我的简单建议是一开始不要玩手榴弹。
附加说明:
所以,首先声明所有函数,然后声明全局变量,最后声明其他代码。遵循这些经验法则,你就不会出错。最好将声明放在网页的头部,将其他代码放在正文中,以确保这些规则的执行。 |
|
|
code-geek · Jquery根据单选按钮选择隐藏或显示文本字段 1 年前 |
|
|
Alex · 在轻量级中同时解构和不解构变量 1 年前 |
|
|
Ângelo Rigo · ReactJS映射:如何迭代[关闭] 1 年前 |
|
|
bairog · 从按属性筛选的对象数组字典中创建值数组 1 年前 |
|
|
lokiuucx · JS对象属性返回未定义,尽管对象属性应该有值 1 年前 |