js变量提升,scope作用域

来源:互联网 发布:log4j数据存进mongodb 编辑:程序博客网 时间:2024/05/01 23:20

之所以想起再来温习一遍js的作用域,及js变量解析方式,是因为今天的公司下面的这道题,很显示我挂掉了。好逮也是老前端了 ,不称职。

上代码

//6.    What will be written to the console for the following code snippet?(function () {    var a = [1];    function bar() {        if (!a) {            var a = [1, 2];        }        console.log(a.join());    }    bar();})()

我直接给了一个1,结果可想而知,看正确的答案

[1,2]

在js中,变量的声明会被解析器悄悄的提升到方法体的最顶部,但是需要注意的是,提升的仅仅是变量的声明,变量的赋值并不会被提升

怎么理解???比如上面的bar函数虽然var a=[1,2]在if判断中并没有运行,但是js在解析时会先将var a=[1,2]在bar的顶部先进行申明也就是提升,看如下面的代码,忘提 了关键的是他不会提升变量的值。也就是说a在此时始终是undefinded,也就是仅仅只是申明确没有赋值;

//js实际解析是这样的function bar() {    var a;        if (!a) {            console.log(a);           //undefinded  测试a的值                     a = [1, 2];        }        console.log(a.join());        //[1,2]}

是不是有种错觉,函数内部访问不到全局变量了。肯定不是。只是因为javascript解析关系.a被重新覆盖了.

0 0