JavaScript 杂记(一)全局预处理与函数预处理

一、js全局预处理与函数预处理

1、全局预处理描述:

在js文件执行前,会先进行全局预处理,将js文件中定义的变量及函数提取出来,变量赋值为undefined,函数则是指向函数本身,之后再去除var关键字后一行行运行。 如:

var a = 3;
function f(){
    console.log(123);
}

预处理时会得到一下结果:

a=undefined;
f=function(){
    console.log(123);
}

可运行以下代码验证:

 console.log(a);//undefined
 console.log(f);//function f(){console.log("test");}
 var a = 4;
 function f(){
    console.log("test");
 }

以上代码第一行并未报错,而是打印了undefined,因为此时进过全局预处理,变量a已经初始化为undefined,同样第二行代码会打印函数具体内容,如果打印全文都没有定义的变量则会报变量未定义的错误,读者可自行验证。

2、特殊情形:变量与方法名冲突

当js文件中定义了与方法名相同的全局变量时,全局预处理会将优先处理函数定义而忽略变量定义,即无论变量在函数前还是在函数后定义,都会被函数定义覆盖,但执行时变量可以覆盖函数定义(猜测预处理时先处理变量,后处理函数,所以变量定义完成后开始定义函数时,其引用指向了函数定义)。如:

console.log(a);//function a(){console.log("test");}
function a(){
    console.log("test");
}
var a = 4;
console.log(a);//4

此时先定义了a函数,又定义了a变量,但第一行打印的结果为a函数的具体信息,而在执行阶段“a=4”被执行,此时函数的引用指向了值4,最后一行打印了4。

3、函数预处理

在函数调用前,对函数同样会进行一次预处理,将函数定义的参数定义为调用时传入的值,函数内部的变量定义及函数定义和命名冲突与全局预处理相同,另外会创建一个数组arguments,其值为调用函数时传进来的值。

4、未用var关键字定义的变量:
JavaScript允许不定义变量直接使用,此时无论是全局预处理或者函数预处理都无法找到该变量,在执行时才创建。如:

console.log(a);
a=10;
console.log(a);

以上代码在第一行执行时报错,因为预处理阶段并未发现变量a,注释第一行代码后正常运行并打印出10(表示不愿意看到这样的代码,会不自主的回去找a在哪儿定义了)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值