js变量问题

clipboard.png

分两个问题:

1.while相当于是一个块级作用域。在块级作用域中定义的变量name是一个全局变量。所以输出的是obama。是这样理解的吗?

2.之前定义的一个变量name='zach'。 之后在while中定义的name是把之前定义的name的覆盖掉了吗?还是说 ,只是把新的值 ‘obama’ 指向之前的name呢?

求解惑

更新:

关于第二个问题,有点蒙蔽,有的说是替代了,有的说是更新name的值....我到底该如何抉择

阅读 2.8k
6 个回答

1.while不是块级作用域,for也不算。JS的常用的块级作用域是函数,不常见的还有with/catch等。所以你可以默认JS除函数外是没有块级作用域的

2.引擎在执行var name='obama'这里时,会查找有无name定义,如果有定义就直接赋值。因此答案是指向之前的name

===================
第二个问题是更新,这与引擎的处理方式有关。

对于说替代的答案,你们想过变量提升吗?

等效代码:

var name; 
var name;
name = 'zach'
name = 'obama'

告诉我这怎么替代?

1.while不是块级作用域,在里面定声明的变量是全局变量,在外面完全可以访问。
2.之前定义的一个变量name='zach',重新在全局同名变量,替代了。

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并没有被覆盖
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题