首先,所有的全局变量都是window的属性,语句 var a = 1;等价于window.a = 1; 你可以用如下方式来检测全局变量是否声明:"变量名称" in window 第二,所有的变量声明都在范围作用域的顶部,看一下相似的例子: alert("b" in window); var b; 此时,尽管声明是在alert之后,alert弹出的依然是true,这是因为JavaScript引擎 首先会扫墓所有的变量声明,然后将这些变量声明移动到顶部,最终的代码效果是这样的: var a; alert("a" in window); 这样看起来就很容易解释为什么alert结果是true了。 第三,你需要理解该题目的意思是,变量声明被提前了, 但变量赋值没有,因为这行代码包括了变量声明和变量赋值。 你可以将语句拆分为如下代码: var a; //声明 a = 1; //初始化赋值 当变量声明和赋值在一起用的时候,JavaScript引擎会自动将它分为两部以便将变量声明提前, 不将赋值的步骤提前是因为他有可能影响 代码执行出不可预期的结果。 所以,知道了这些概念以后,重新回头看一下题目的代码,其实就等价于: var a; if (!("a" in window)) { a = 1; } alert(a); 这样,题目的意思就非常清楚了:首先声明a,然后判断a是否在存在,如果不存在就赋值为1, 很明显a永远在window里存在,这个赋值语 句永远不会执行,所以结果是undefined。 提前这个词语显得有点迷惑了,你可以理解为:预编译。 |
"if (!(""a"" in window)) { var a = 1; } alert(a); 为什么结果是undefined"
最新推荐文章于 2021-08-31 20:23:45 发布