【发布时间】:2016-07-27 13:47:38
【问题描述】:
我尝试了 JavaScript 来理解它的提升策略,但更加困惑:
function f(i){this.i+=i}
i=2
f(3)
console.log(i)
输出
5
(1) 这是我的预期。然后我尝试重新定位“i=2”语句:
function f(i){this.i+=i}
f(3)
console.log(i)
i=2
输出
NaN
(2) 为什么会这样?我期望因为“i”被提升到整个程序的前面,为什么它会打印“NaN”?一个可能的答案是,程序被编译器重构为:
var i
function f(i){this.i+=i}
f(3)
console.log(i)
i=2
(3) 所以当“console.log(i)”时,i没有被赋值,所以是“NaN”--->但是我尝试了下面的程序:
function f(i){this.i+=i}
f(3)
i=2
console.log(i)
如果上面的解释是正确的,我希望这也应该输出“NaN”。但实际上它输出
2
这更奇怪。在这种情况下,“提升”是否有效?
(4) 更有趣的是,如果我将程序更改为:
var i
function f(i){this.i+=i}
f(3)
console.log(i)
i=2
然后输出
undefined
这是为什么呢?
(5) 对于程序:
var i
function f(i){this.i+=i}
f(3)
i=2
console.log(i)
再次输出
2
您能否解释一下上述观察结果,因为它真的来自我对“提升”是什么的理解?
【问题讨论】:
-
在 3) 和 5) 中,您在执行 console.log(i) 之前定义了 i = 2,这就是它显示为 2 的原因。
-
您似乎将“提升”与“上下文”和“范围”混为一谈。
-
值得指出的是,您从未在函数
f(i)中实际使用过参数i。this.i将引用调用函数的任何对象,但i将引用参数。这些不一定是同一个对象。
标签: javascript function variables scope hoisting