标签:
先来做三个测试
eg1:
1 var a; 2 a = 1; 3 4 function a() {}; 5 console.log(a);
eg2:
1 var a; 2 function a() {}; 3 console.log(a);
eg3:
1 var a; 2 function a() {}; 3 a = 1; 4 console.log(a);
eg1:输出1 eg2:输出a方法 eg3:输出1
为什么输出结果是这样的?
先来看看js预编译实现过程:
1.js首先扫描var关键字,提前到顶端;
2.然后扫描function定义,提到var之后
3.然后再顺序执行
那么上面的三个例子预编译形式分别如下:
eg1:
1 var a; 2 3 function a() {}; 4 a = 1; 5 console.log(a);
eg2:
1 var a; 2 3 function a() {}; 4 console.log(a);
eg3:
1 var a; 2 3 function a() {}; 4 a = 1; 5 console.log(a);
了解预编译过程后可以再来看看下面几个例子,试着先做一下
1.
f(); function f(){ console.log("a"); } ========================================== f(); var f = function(){ console.log("a"); }
第一个程序 运行输出:1 ;第二个程序运行报错,f is not a function()
2.
function f(){ console.log("a"); } f(); function f(){ console.log("b"); } f(); ========================================== function f(){ console.log("a"); } f(); var f = function(){ console.log("b"); } f(); ============================================= var f = function(){ console.log("a"); } f(); function(){ console.log("b"); } f();
第一个输出:b b ; 第二个输出:a b ; 第三个输出:a a
js引擎读取一段js代码,首先预编译,寻找全局变量和全局函数,遇到全局变量,把变量的值变为undifined存放在内存中,并不进行赋值操作,遇到全局函数,也是存放在内存中,如果这个过程中发现语法错误,预编译终止。
标签:
原文地址:http://www.cnblogs.com/thonrt/p/5915568.html