JavaScript预解析

JavaScript引擎在对JavaScript代码进行解释执行之前,会对JavaScript代码进行预解析,在预解析阶段,会将以关键字var和function开头的语句块提前进行处理。

关键问题是怎么处理呢?

当变量和函数的声明处在作用域比较靠后的位置的时候,变量和函数的声明会被提升到作用域的开头。

(1)、函数提升

func();
function func(){
    alert("Funciton has been called");
}
由于JavaScript的预解析机制,上面的代码就等效于:
 
function func(){
    alert("Funciton has been called");
}
func()

(2)、变量提升

alert(a);
var a = 1;
相当于
 
var a; //这里是声明
alert(a);//变量声明之后并未有初始化和赋值操作,所以这里是 undefined
a = 1
so,变量的提升只是声明的提升
(3)、函数同名

func1();
function func1(){
    console.log('This is func1');
}
func1();
function func1(){
    console.log('This is last func1');
}

同名的函数,后面的会覆盖前面的,所以两次输出结果都是This is last func1。

(4)、变量和函数同名

alert(foo);
function foo(){}
var foo = 2;
当出现变量声明和函数同名的时候,只会对函数声明进行提升,变量会被忽略。
 
function foo(){}

(5)、预解析是分作用域的

 提升原则是提升到变量运行的环境(作用域)中去。
 
function showMsg()
{
var msg = 'This is message';
}
alert(msg); // msg未定义

(6)、函数表达式不会提升

func();
var func = function(){
    alert("我被提升了");
};
这里会直接报错,func is not a function,原因就是函数表达式,并不会被提升。只是简单地当做变量声明进行了处理

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值