函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別?
function foo(){} ? ??函數(shù)聲明
var f = function foo(){}; ?函數(shù)表達(dá)式
new function foo(){}; ? ? ?函數(shù)表達(dá)式援岩,因?yàn)樗荖ewExpression表達(dá)式
(function (){
function foo(){}; ? ? ? ? ? ? ?函數(shù)聲明享怀,是函數(shù)體的一部分
}) ();
(function foo(){})添瓷; ? ? ? ? ?函數(shù)表達(dá)式值纱,因?yàn)樗话诜纸M操作符中虐唠,分組操作符只能包含表達(dá)式
簡單來說,如果function foo(){}作為賦值表達(dá)式的一部分咱筛,則其為函數(shù)表達(dá)式,如果function foo(){}被包含在函數(shù)體內(nèi)反番,或者處于程序的最上層,則認(rèn)為它是函數(shù)聲明篙贸。
兩者的異同:
函數(shù)聲明會(huì)在任何表達(dá)式被解析和求值之前先被解析求值爵川;而表達(dá)式是遇到再算寝贡。
什么是變量的聲明前置值依?什么是函數(shù)的聲明前置
變量的聲明前置就是無論變量的聲明在程序什么位置出現(xiàn)愿险,都將它置于初始的位置。
函數(shù)聲明前置是指將函數(shù)的聲明置于初始位置风秤,但是在變量聲明之后缤弦。
上述代碼執(zhí)行后會(huì)出現(xiàn)function和1甸鸟,因?yàn)閷?shí)際相當(dāng)于
arguments 是什么
arguments是函數(shù)的參數(shù)集合抢韭,用于獲取參數(shù)數(shù)組刻恭,也可用于函數(shù)重載鳍贾。
函數(shù)的重載怎樣實(shí)現(xiàn)
function sum(a,b,c){
? ? var ?sum =0;
? ?for (var i =0; i<arguments.length; i++){
sum += arguments[i];
? ? }
return sum骑科;
}
上述函數(shù)是一個(gè)重載的求和函數(shù)构拳。
立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用
(function sum(){})();
(function(){})(); ? ? ?匿名函數(shù)
可以讓函數(shù)在定義后直接調(diào)用斗埂,作用是在固有的作用域內(nèi)使用呛凶,不會(huì)污染全局變量
什么是函數(shù)的作用域鏈
全局作用域,就是在函數(shù)外聲明或者在函數(shù)內(nèi)部未加var的變量都存在與全局作用域模闲。
局部作用域围橡,就是在函數(shù)內(nèi)部可以訪問到的作用域缕贡。
作用域鏈就是函數(shù)在使用過程中,會(huì)查找相應(yīng)的變量或函數(shù)聲明收擦,首先是在當(dāng)前作用域查找塞赂,之后開始逐級(jí)向上查找宴猾,這就形成了作用域鏈仇哆。
代碼
1.
2.
3.因?yàn)樽兞柯暶髑爸枚锾蓿詀是未定義延欠,而b沒有聲明由捎,所以報(bào)錯(cuò)
4.實(shí)際的執(zhí)行順序如下狞玛,所以輸出helloworld和sayAge未聲明
5.
實(shí)際執(zhí)行路線
6.因?yàn)閷?shí)際的執(zhí)行順序是
7.因?yàn)閒n是1不是函數(shù)所以報(bào)錯(cuò)
8.因?yàn)槁暶髑爸妹沙耄郧皟身?xiàng)未初始化膳凝,后兩項(xiàng)循環(huán)后得10蹬音,100休玩,這里有個(gè)問題拴疤,i,j的變量聲明不是在for循環(huán)里面的嗎苔埋,應(yīng)該是局部變量才對(duì)呀组橄,所以如果是局部變量的話罚随,是不是前兩個(gè)應(yīng)該報(bào)錯(cuò)才對(duì)毫炉?是因?yàn)檎Z句寫的變量(不在函數(shù)內(nèi))所以都是全局變量嗎瞄勾?
9.實(shí)際順序如下
10.函數(shù)輸出10-2愿阐,運(yùn)行后銷毀缨历,之后輸出0
版權(quán)歸ENVY和饑人谷所有,轉(zhuǎn)載請(qǐng)注明出處