js 理解变量声明提前

记住:exclamation:当js执行的时候遇见varfunction函数的时候,将会出现变量声明提前。这个过程也被叫做,“预解析”或者“预编译”。

两种方式不同处:

  • 对var 声明只是将声明提前,赋值仍然保留在原位置;
  • function 声明,会将函数名称和函数体都提前,而且先预声明变量再预定义函数。

简单例子:

var声明代码段

console.log(a);  //不会出错,会输出undefined
var a=100;
console.log(a); //100;

由于从上往下执行时遇见了var,所以实际执行顺序:

var a;   //声明提前
console.log(a);//undefined
a=100; //赋值任然留在原位置
console.log(a);//100
  • 声明提前仅能将声明提前到所在作用域的顶部。如下所示:在函数中的var,则将声明提到函数内的第一行。
function  fn(){
     console.log(a); //undefined
     var a=100;
     console.log(a); //100
};
fn();
console.log(a);//   报错未定义!

实际执行:

function fn(){
     var a;  //仅仅提前到函数顶部
     console.log(a);  //undefined
     a=100;
     console.log(a); //100
};
fn();
console.log(a); //报引用错误

function声明代码段

console.log(fn());  //2
function fn(){
     return 2;
}

实际执行:

var fn;
fn = function{
  return 2
}
console.log(fn());

:point_right:以下是两个声明综合的小例子:

var a=123;
function a(){ return 1 }
console.log(a);

实际执行:

var a;
function a(){ return 1 }
a=123;
console.log(a); //123
  • 由此可见,函数声明的优先级比var声明更高,如果两者同时存在,则先执行函数提前声明。

  • es6 的 let 则无此问题,是es5的严格模式,所不存在变量提前,但会有暂时性死区。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值