JavaScript变量提升

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

<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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值