您的位置:首页 > Web前端 > JavaScript

JavaScript变量提升

2017-05-01 15:14 183 查看
先来看一段代码,尝试写出答案。

<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做对比,应该更易于理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: