论坛首页 Web前端技术论坛

Javascript笔记之 预编译与重名函数

浏览 2126 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-02   最后修改:2009-06-09

Javascript 果然存在所谓的预编译,例证:

 

1.变量预编译:

 

var test_a = 'a test';

function test1(){
        alert(test_a);
}

function test2(){
        alert(test_a);
        var test_a = "a test in function";
        alert(test_a);
}

test1();
test2();

 

 

结果 :[a test] [undefined] [a test in function];

 

个人理解(也参照了网上的很多解释):

浏览器在执行一个作用域内的javascript代码时,会预先将以var定义的变量标记为已定义(相当于在该作用域内注册),并“赋初值:undefined”;

执行代码时遇到变量引用,会先定位作用域内已经定义的变量,若找到则使用该变量(在test2中test_a已经被预定义了,所以可以找到,则会输出其值——undefined),若找不到则向父作用域定位变量,一直到window作用域,假如一直到最后都未找到该变量,那么程序到此会报错,说“变量未定义”;

 

可以再试试下面的代码,以便加深理解:

 

 

function test1(){
        alert(test_a);
	test_a = "a test in function test1";
	alert(test_a);
}

function test2(){
        alert(test_a);
        var test_a = "a test in function";
        alert(test_a);
}
test1();
test2();
alert(test_a);
var test_a = 'a test';
// test_a = 'a test'; 试着去掉该句注释,然后将上一句注释掉看看会怎么样

 

 

 

2.函数预编译:

 

 

myfunc();
function myfunc() {
	alert("myfunc for the first time");
	return false;
}
myfunc();

myfunc = function() {
	alert("myfunc for the second time");
	return false;
}
myfunc();

function myfunc() {
	alert("myfunc for the third time");
	return false;
}
myfunc();
alert(myfunc);

 

 结果

[myfunc for the third time]

[myfunc for the third time]

[myfunc for the second time]

[myfunc for the second time]

[function () { alert("myfunc for the second time"); return false; }]

 

个人理解(也参照了网上的很多解释):

 

暂时只讨论一个作用域内平级的函数块(不同作用域也不会产生重名)。浏览器在执行一个作用域内代码时,也会预先对function fun(){}形式的函数进行“预编译”,并且对于重名的函数,只保留其最后一次的定义的代码逻辑。执行过程中将不再对function fun(){}形式定义的同名函数的逻辑进行重写,但是遇到fun=function(){}这样形式的重名函数,浏览器又会重写fun函数中的代码逻辑(真是怪哉 )。

并且,和变量一样,函数形如var func = function(){}的,在预编译中也会被“注册”到本作用域的已定义变量中,并且初值赋为“undefined”,所以这样定义的函数不能在赋值之前这样执行func(),否则会报错:"func is not a function",因为正式赋值之前浏览器就将它看做一个普通变量(初值为undefined)

 

   发表时间:2009-06-03  
好文章 学习了
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics