JavaScript 中函数定义的差异问题

来源:岁月联盟 编辑:exp 时间:2012-02-11

[javascript]
try { 
    fun1(); 
} catch(e) { 
    alert(e); 
}; 
 
try { 
    fun2(); 
} catch(e) { 
    alert(e); 
}; 
 
function fun1() { 
    alert("this is fun1."); 

 
var fun2 = function() { 
    alert("this is fun2."); 

 
try { 
    fun2(); 
} catch(e) { 
    alert(e); 
}; 
try {
 fun1();
} catch(e) {
 alert(e);
};

try {
 fun2();
} catch(e) {
 alert(e);
};

function fun1() {
 alert("this is fun1.");
}

var fun2 = function() {
 alert("this is fun2.");
}

try {
 fun2();
} catch(e) {
 alert(e);
};
因为这样的写法更有助于区别函数的定义和一般变量的定义.

 


但这样的写法,

[javascript]
function fun1() { 
    alert("this is fun1."); 

function fun1() {
 alert("this is fun1.");
}


当这个function的语句在解析时会发生被提升的情况.( 加粗部分出自<JavaScript语言精粹>)

这就是意味着,用此方法无论在哪里定义的函数,都会被移动到定义时所在作用域的顶层.

也就是说,在定义的作用域内都可以调用该函数,这就不符合"先定义后调用"的理念.

这样会影响代码可读性和带来一些混乱,所以在编码时更应该注意"先定义后调用".

 


而下面的代码,则解决了上面所提及的问题.

[javascript]
var fun2 = function() { 
    alert("this is fun2."); 

var fun2 = function() {
 alert("this is fun2.");
}


函数fun2的调用必须在函数的定义之后,不然会抛出错误.

因为这种写法类似于定义一个变量,在定义fun2之前,fun2是不存在的.

虽然这种写法解决了 不符合"先定义后调用" 的问题,但这样的写法不够直观.

摘自 简生的代码备忘录