JavaScript变量提升

来源:互联网 发布:淘宝买ps3是新机吗 编辑:程序博客网 时间:2024/06/11 23:29

先来看一段代码,尝试写出答案。

<script>var v1 = '这是全局变量v1';  var f1 = function(){    var d=v1;  console.log(d);  console.log(v1);       var v1 =  '这是局部变量v1';  };var v2 = '这是全局变量v2';  var f2 = function(){    console.log(v2);    };var v3 = '这是全局变量v3';  var f3 = function(){      var d=v3;    var v3='这是局部变量v3';    var dd=v3;    console.log(d);    console.log(v3);    console.log(dd);    };var v4 = '这是全局变量v4';  var f4 = function(){   var d=v4;   console.log(d);     };</script>

f2和f4 的答案都不难得出

即分别输出window对象下的全局变量 v2和v4

原因就是函数f2和f4在建立自身的词法环境时,会先从函数体本身寻找变量,当自身找不到时,则继续遍历作用域链的上级词法环境,直到找到或者寻找对象为null为止。


而f1则输出 两个 undefined

这就涉及到了变量提升的问题了

当一个函数被建立且载入运行环境时,它会建立一个自身词法环境,该环境会预先声明自身函数体内的所以变量和函数

但在f1中变量v1的调用先于声明,故在建立词法环境时,js引擎将v1提前到调用前声明,但仅仅只是声明,并没有赋值,即v1=undefined

变量提升后的f1为:

var v1 = '这是全局变量v1';  var f1 = function(){    var v1 = undefined;    var d=v1;  console.log(d);  console.log(v1);     };

f3同理,加了个dd做对比,应该更易于理解。


0 0
原创粉丝点击