预解析与函数变量声明提升

来源:互联网 发布:java自定义表单设计器 编辑:程序博客网 时间:2024/06/08 14:38

1、预解析:解析器会在代码执行之前进行预解析,在预解析的过程中,会对函数和变量的声明进行提升,注意:只提升声明,不提升赋值。在执行代码的时候才会进行赋值操作。

var a = 10;fn();function fn(){    console.log(a);// undefined    var a = 20;}

上面代码的执行结果会输出undefined,因为虽然a已经在全局环境中进行了赋值,但是在函数作用域中,重新定义了一个a,并且只进行了变量的声明提升,还没进行赋值操作,所以输出undefined。

var a = 10;fn(a);function fn(a){    console.log(a);// 10    var a = 20;}

如果把全局作用域中的a当做实参传入进去,会输出10,因为在预解析的时候,函数内a的值已经被赋值为10,然后才被重新赋值的。
2. 吐槽:在这里我只是简单的举了两个例子,由于预解析和函数作用域的关系,很容易让人迷惑,所以类似于这类的面试题层出不穷,仿佛JavaScript的重点都在这儿一样。如果你有兴趣又有时间,可以去网上找类似的题目看看。幸好ES6中对于变量提升和函数作用域进行了改进,这让开发变得更加的快捷方便。

原创粉丝点击