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

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

2018-02-05 12:08 204 查看
一、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在哪儿定义了)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  学习 笔记