JavaScript 杂记(一)全局预处理与函数预处理
2018-02-05 12:08
204 查看
一、js全局预处理与函数预处理
1、全局预处理描述:
在js文件执行前,会先进行全局预处理,将js文件中定义的变量及函数提取出来,变量赋值为undefined,函数则是指向函数本身,之后再去除var关键字后一行行运行。 如:
预处理时会得到一下结果:
可运行以下代码验证:
以上代码第一行并未报错,而是打印了undefined,因为此时进过全局预处理,变量a已经初始化为undefined,同样第二行代码会打印函数具体内容,如果打印全文都没有定义的变量则会报变量未定义的错误,读者可自行验证。
2、特殊情形:变量与方法名冲突
当js文件中定义了与方法名相同的全局变量时,全局预处理会将优先处理函数定义而忽略变量定义,即无论变量在函数前还是在函数后定义,都会被函数定义覆盖,但执行时变量可以覆盖函数定义(猜测预处理时先处理变量,后处理函数,所以变量定义完成后开始定义函数时,其引用指向了函数定义)。如:
此时先定义了a函数,又定义了a变量,但第一行打印的结果为a函数的具体信息,而在执行阶段“a=4”被执行,此时函数的引用指向了值4,最后一行打印了4。
3、函数预处理
在函数调用前,对函数同样会进行一次预处理,将函数定义的参数定义为调用时传入的值,函数内部的变量定义及函数定义和命名冲突与全局预处理相同,另外会创建一个数组arguments,其值为调用函数时传进来的值。
4、未用var关键字定义的变量:
JavaScript允许不定义变量直接使用,此时无论是全局预处理或者函数预处理都无法找到该变量,在执行时才创建。如:
以上代码在第一行执行时报错,因为预处理阶段并未发现变量a,注释第一行代码后正常运行并打印出10(表示不愿意看到这样的代码,会不自主的回去找a在哪儿定义了)。
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在哪儿定义了)。
相关文章推荐
- JavaScript全局函数
- JavaScript基础之Date对象与全局属性函数
- JavaScript全局函数eval的用法
- ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->addRange 函数
- JavaScript----全局函数、对象
- ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->clear 函数
- javascript基础笔记(十四)之js的全局函数
- JavaScript全局对象之Number函数与String()函数
- 浅析JavaScript中两种类型的全局对象/函数
- JavaScript学习日志——内建的全局函数
- ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->clone 函数
- JavaScript的全局函数
- JavaScript中两种类型的全局对象/函数【转】
- JavaScript基础之八——全局函数的应用
- javascript 全局属性和函数
- ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->contains 函数
- JavaScript 函数全局变量定义
- javascript内建的全局函数详解
- JavaScript全局函数与自定义函数-Functions