分两个问题:
1.while相当于是一个块级作用域。在块级作用域中定义的变量name是一个全局变量。所以输出的是obama。是这样理解的吗?
2.之前定义的一个变量name='zach'。 之后在while中定义的name是把之前定义的name的覆盖掉了吗?还是说 ,只是把新的值 ‘obama’ 指向之前的name呢?
求解惑
更新:
关于第二个问题,有点蒙蔽,有的说是替代了,有的说是更新name的值....我到底该如何抉择
分两个问题:
1.while相当于是一个块级作用域。在块级作用域中定义的变量name是一个全局变量。所以输出的是obama。是这样理解的吗?
2.之前定义的一个变量name='zach'。 之后在while中定义的name是把之前定义的name的覆盖掉了吗?还是说 ,只是把新的值 ‘obama’ 指向之前的name呢?
求解惑
更新:
关于第二个问题,有点蒙蔽,有的说是替代了,有的说是更新name的值....我到底该如何抉择
var name = 'zz'
while(true) {
let name = 'xx'
console.log(name) //xx
break
}
console.log(name) // zz
js中没有块级作用域这种概念,他只有全局变量和局部变量两种作用域,全局就是当前页面任何地方都可以使用,局部变量声明在函数中,函数外部不可用。所以在while中声明的变量,依然是全局变量,你把第一次var声明的name变量重新赋值了
你的代码相当于:
window.name = 'a'
while(true) {
window.name = 'b'
console.log(name) //b
break
}
console.log(name) //b
在ES6之前,理论上JS是没有块级作用域存在的所以你的这个代码其实就是这样:
var name = 'zach';
var name = 'obama'; // 覆盖全局变量中的 name
console.log(name); // obama
console.log(name); // obama
那个while
并不像你以为的有会形成一个块级作用域。
当然,如果你想实现你想要的,可能应该是这样:
let name = 'zach';
while(true){
let name = 'obama'; // 在 while 内部新声明了一个 name 变量,这是你以为的块级作用域
console.log(name); // obama
break;
}
console.log(name); // name,全局变量中的name并没有被覆盖
10 回答11.2k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1.
while
不是块级作用域,for
也不算。JS
的常用的块级作用域是函数,不常见的还有with/catch
等。所以你可以默认JS
除函数外是没有块级作用域的2.引擎在执行
var name='obama'
这里时,会查找有无name
定义,如果有定义就直接赋值。因此答案是指向之前的name
===================
第二个问题是更新,这与引擎的处理方式有关。
对于说替代的答案,你们想过变量提升吗?
等效代码:
告诉我这怎么替代?