最近在看一本新买的书叫《你不知道的javascript上卷》。。买到这本书也算是个巧合 不过真是物有所值。它对js的几个高级概念都做了非常深刻的描述和通过一些通俗易懂的方式来让我们理解。这篇文就是解决了 一直困扰我的js申明提升的问题。 下面就是我的一些总结和一些笔记。
首先来看一个 例子。
a= 2;
var a;
console.log(a);
看到 这个例子 就让我想到 一直困扰我的一直没有弄明白的在前面申明 和 在后面申明 有时候会出现不同效果的情况。但是一直没有去仔细研究明白过
在这里也许 会有一些朋友认为它可能会输出undefined。因为 因为第二排变量被重新赋值的关系。
但是结果是,这里会输出2;
先不着急 我们再看一个例子。
console.log(a);
var a =2;
这个例子 我相信有人会觉得 可能会输出2 也有可能 有人认为 在console.log之前 还没有申明 var a 所以会抛出 referenceerror的错误。。
但是结果是 输出的却是 undefined;
这里要究其原因,就要讨论一下 javascript 编译器 在这里面所进行的行为。
当编译器看到
var a =2;
这样的语句的时候 并不会像我们理解的一样,把他们一气呵成 就是 申明a 与赋值同时进行 //注意这句话非常重要
而是把他拆分成了
var a;
a =2;
来进行看待。第一个申明 var a 会在编译的时候就进行,而剩下的赋值语句会被留在原地等待执行阶段的时候再执行。
所以照这个逻辑进行理解,也许你就明白为什么会出现上述的行为了。这里我分析当中的第二个例子。
第二个例子会被当成
var a;
console.log(a);
a =2;
这样执行。所以输出的结果是 undefined 是因为已经申明了 却还没有值。
”这个过程就好像变量和函数声明从它们在代码中的位置被移动到了上面,这个过程就叫做 提升“----引用自《你所不知道的javascript上卷》。
最后注意一个地方,无论是函数声明,还是变量声明都会被提升,而函数声明会被首先提升 这里需要注意哟。