为了账号安全,请及时绑定邮箱和手机立即绑定

关于变量名提升的问题?

关于变量名提升的问题?

波斯汪 2018-11-23 18:13:06
下面这段代码执行后是 undefined<script type="text/javascript">if (! 'a' in window) {  var a = 123;}console.log(a);</script>说明 'a' in window 为 true, 可是 a 在什么时候声明的呢?请教大家,谢谢!我又把代码改成:<script type="text/javascript">if (! 'a' in window) {  a = 123;}console.log(a);</script>结果a is not defined。 既然 a 已经声明,为什么会报这个错误呢?
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超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,报错。

查看完整回答
反对 回复 2018-12-18
  • 1 回答
  • 0 关注
  • 556 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信