2 回答

TA貢獻1788條經驗 獲得超4個贊
在JS中函數的定義可以分為兩種:
1. 函數聲明
2. 函數表達式
根據你的代碼,下面的代碼就是函數的聲明(當然另外一段代碼是函數表達式):
function a (){
alert(123);
}
根據JS中的語法特性(注意哦,是js的語法特點,要記住):
在javascript函數體內(執行作用域)聲明的變量,無論在函數體何處聲明,它將都會被提升到函數的頂部,我們稱這種現象為變量提升。 函數呢,它也有這種特性,即無論在函數體何處聲明另一個函數,它將都會被提升到函數的頂部。只是采用函數表達式和函數聲明所體現的函數提升的內容是有差別的:函數表達式和變量提升類似,只會提升函數的變量,不提升函數的定義;而函數聲明提升時,不僅僅會提升函數的聲明,函數的定義也會被提升
根據以上特性,你的代碼在執行時,
function a (){
alert(123);
}
這段代碼被提升到執行作用域的頂端,最開始被執行;
然后,在執行
var a =function(){
alert('234');
}
這段代碼,導致該代碼覆蓋了前面的函數聲明代碼;
不信你可以做個測試:
將a()放到js代碼的最頂端,可以看看會打印什么結果,此時你就明白了!

TA貢獻1848條經驗 獲得超2個贊
1:調用關鍵字function來構造
function distance(x1,x2,y1,y2) { var dx=x2-x1; var dy=y2-y1; return Math.sqrt(dx*dx+dy*dy); } |
2:使用Function()構造函數(請注意與上面的大小寫)
var f= new Function* "x" , "y" , "return x*y" ); |
這行代碼創建了一個新函數,該函數和你所熟悉的語法定義的函數基本上時等價的:
function f(x,y) { return x*y; } |
Functino()構造函數可以接受任意多個字符串參數。它的最后一個參數時函數的主體,其中可以包含任何JavaScript語句,語句之間用分號分隔。其他的參數都是用來說明函數要定義的形式參數名的字符串。如果你定義的函數沒有參數,那么可以只需給構造函數傳遞一個字符串(即函數的主體)即可。
注意,傳遞給構造函數Function()的參數中沒有一個用于說明它要創建的函數名。用Function()構造函數創建的未命名函數有時被成為“匿名函數”。
你可能非常想知道Function()構造函數的用途是什么。為什么不能只用function語句來定義所有的函數呢?原因是Function()構造函數允許我們動態地建立和編譯一個函數,它不會將我們限制在function語句預編譯的函數體中。這樣做帶來的負面影響效應就是每次調用一個函數時,Function()構造函數都要對它進行編譯。因此,在循環體中或者在經常使用的函數中,我們不應該頻繁地調用這個構造函數。
使用Function()構造函數的另一個原因是它能夠將函數定義為JavaScript表達式的一部分,而不是將其定義一個語句,這種情況下使用它就顯得比較的方面,甚至可以說精致。
3:函數直接量
函數直接量是一個表達式,它可以定義匿名函數。函數直接量的語法和function語句非常相似,只不過它被用作表達式,而不是用作語句,而且也無需指定函數名。下面的三行代碼分別使用function()語句、Funciont()構造函數和函數直接量定義了三個基本上相同的函數:
function f(x){ return x*x}; var f= new Function( "x" , "return x*x;" ); var f= function (x){reurn x*x}; |
在JavaScript1.1中,可以使用構造函數Function()來定義函數,在JavaScript1.2和其后的版本中,還可以使用函數直接量來構造函數。你應該注意這兩種方法之間的重要差別。
首先,構造函數Function()允許在運行時動態地創建和編譯JavaScript代碼。但是函數直接量卻是函數結構的一個靜態部分,就像function語句一樣。
其次,作為第一個差別的必然結果,每次調用構造函數Function()時都會解析函數體并且創建一個新東漢數對象。如果對構造函數的調用出現在一個循環中,或者出現在一個經常被調用的函數中,這種方法的效率非常低。另一個方面,函數直接量或出現在循環和函數中的嵌套函數不是在每次調用時都被重新編譯,而且每當遇到一個函數直接量時也不創建一個新的函數對象。
Function()構造函數和函數之間量之間的第三點差別是,使用構造函數Function()創建的函數不使用詞法作用域,相反的,它們總是被當作頂級函數來編譯,就像下面代碼所說明的那樣:
添加回答
舉報