javascript - 关于变量名提升的问题?
巴扎黑
巴扎黑 2017-06-12 09:32:55
[JavaScript讨论组]

下面这段代码执行后是 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' 字符串执行,得到了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 才为 true
才会执行 var a = 123;
才有 a 被赋值123 的存在

学习ing

熊猫桑正解啊=_=

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号