JavaScript 范围
我希望使用我目前知道的最正确的术语,我也知道它并不完全正确。我不是任何 javascript 专家,但您所问的这个问题与JavaScript Scope有关。你可以找到很多关于这个主题的文章,也可以找到一些关于 SO 的问答,就像我在示例中找到的一样
一步步
我将尝试逐行重现您的 snipnet 是什么。如果您在某处注意到错误的术语,请发表评论,我喜欢随时学习:D
1号线
var doB = function() { return a+1};
方法
在当前作用域上存储一个名为“doB”的变量,将其内容分配给匿名函数。
所以...
a
暂时没关系。
2号线
var b = a+1;
方法
存储一个b
在当前范围内命名的变量,将其内容分配给一个new Integer(1)
除了变量a
。
所以...
此时a
是undefined
因为它没有在当前范围内声明,其他范围也不能从这个范围内访问。运算undefined + a
等于NaN
。a
被赋值NaN
为值。
3号线
var a = 3;
方法
存储a
在当前范围内命名的变量,将其内容分配给new Integer(3)
所以...
现在我们有一个a
存储整数的变量。
第 4 行
console.log(b);
输出NaN
,因为b
实际上是NaN
.
第 5 行
console.log( doB() );
方法
使用不带参数调用函数console.log
的返回值doB
作为第一个参数调用函数。
所以...
doB
被调用并返回:a+1
意思是
new Integer(1)
除了变量a
. a
不存在于函数本地范围内,但存在于函数内可访问的范围内。该值是从那里获取的,实际上是3
. 控制台输出4
。