JS面试经:从几个小问题走进js

1.变量提升
首先看两段段代码,写出结果

console.log(a); //undefined
var a=1;
var b=a;
b=3;
console.log(b);  //3




console.log(sum(1,2)); //3
function sum(n,m) {
    return n+m;
}





先不着急看结果,先分析一下,js操作浏览器的语言,要执行代码浏览器就得开辟出一片空间,这个空间就是栈/堆内存;但是开辟空间以后,代码并没有自上而下立即执行,而是把当前作用域中带 var/function关键字的变量纪念性提前的声明和定义,这个就是变量提升;但是要注意 有var关键字的变量只提前声明(declare),但不关联任何值,此时该变量的值是undefined,但是有function关键字的,会声明而且赋值;
所以第一块代码 a和b都有var会被提前声明,a的初始值就是undefined;
分析下第二块代码,sum函数被提前声明而且赋值了,首先,所以浏览器会开辟出堆内存来存入sum函数,这点不同于上文的a,a是值类型会存储在栈内存中的,而且我们说过关键字为function会声明切赋值,sum就会和内存地址关联起来,所以sum函数能正常执行;
那么我们再来看看另一块代码,巩固一下刚才的理解:

console.log(sum); //undefined
sum(1,2) // error: sum is not a function
var sum =function (n,m) {
        return n+m;
    };

第二 、第三块代码中牵涉到函数表达式的方法,第三块代码是把匿名函数赋值给变量,关键字是var,所以就遵循变量提升的值声明不赋值的规则;
本人第一次发表文章,故此先抛砖引玉,望各位大佬多多指正,下一次我会带上ES6新特性的语法来一起分析对比js执行机制

暂无评论