javascript - 关于变量名提升的问题?
巴扎黑
巴扎黑 2017-06-12 09:32:55
0
5
596

下面这段代码执行后是 undefined

<script type="text/javascript">
if (! 'a' in window) {
  var a = 123;
}
console.log(a);
</script>

说明 'a' in windowtrue, 可是 a 在什么时候声明的呢?请教大家,谢谢!

我又把代码改成:

<script type="text/javascript">
if (! 'a' in window) {
  a = 123;
}
console.log(a);
</script>

结果a is not defined。 既然 a 已经声明,为什么会报这个错误呢?

巴扎黑
巴扎黑

全部回复(5)
黄舟

先说变量提升吧

if (! 'a' in window) {
  var a = 123;
}
console.log(a);

这段代码无论是否进入 if 的代码块内,a 都是存在的

因为在 JavaScript 执行时,所有通过 var 定义的变量以及声明式函数都会被提升到当前作用域的顶部

而通过 var 创建的变量是没有块级作用域的,所以会提升到当前函数作用域的顶部

在全局作用域定义的变量都是 window 的属性

所以这段代码实际上执行的时候是这样的顺序

var a;
if (! 'a' in window) {
  a = 123;
}
console.log(a); // undefined 

定义了 a,但没有赋值,自然输出了 undefined

关于其中! 'a' in window 其实是先对 'a' 字符串执行! 'a' in window 其实是先对 'a' 字符串执行,得到了falsewindow 里没有 window.false 这个属性,返回了 false

,得到了falsewindow 里没有 window.false 这个属性,返回了 false,没有进入 if 代码块。

具体可尝试以下例子

false in window; // false

window.false = 123;

false in window; // true

!false in window; // false

true in window; // false

window.true = 456;

!false in window; // true

'true' in window; // true
第二个问题

if (! 'a' in window) {
  a = 123;
}
console.log(a); // Uncaught ReferenceError: a is not defined
var 定义(不存在提升),又没进 if看懂了上面这个就很简单了,没用 定义(不存在提升),又没进 🎜,导致没有定义 a,报错。🎜
大家讲道理

这段执行没毛病啊,! 'a' in window这个是false,然后a的赋值没执行,再console不就是undefined么。
如果想让赋值执行,判断条件改成!('a' in window)就行了。

如果还没明白,查一下运算符优先级列表。

代言

var声明的时候会发生变量提升,在编辑阶段就把代码声明放在函数或者代码开头,所以就变成这个样子:

<script type="text/javascript">
var a;
if (! ('a' in window)) {
  a = 123;
}
console.log(a);
</script>

所以a in windowtrue

至于

<script type="text/javascript">
if (! ('a' in window)) {
  a = 123;
}
console.log(a);
</script>

代码不包含var a。所以不存在变量提升的问题,所以a就没有声明过,所以!('a' in window)是true,所以a123

https://developer.mozilla.org...

阿神

你第一段就理解错了
'a' in window 为 false'a' in window 为 false
!'a' in window 才为 true
才会执行 var a = 123;!'a' in window 才为 true
才会执行 var a = 123;

才有 a 被赋值123 的存在🎜
学习ing

熊猫桑正解啊=_=

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板