函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別
- 函數(shù)聲明可以像變量聲明前置一樣娜遵,所以在作用域上下任何地方可以調(diào)用。
- 函數(shù)表達(dá)式只能在賦值后調(diào)用
什么是變量的聲明前置?什么是函數(shù)的聲明前置
- JavaScript解析器先解析所有變量的聲明,提升到各自作用域的頂端,再運(yùn)行代碼
- 函數(shù)聲明提前類似于變量聲明提前
- 順序?yàn)?變量 -> 函數(shù) -> 參數(shù)
arguments 是什么
- 一組類數(shù)組形式的參數(shù)對象
函數(shù)的重載怎樣實(shí)現(xiàn)
- 在JavaScript中可以傳入不同組別的參數(shù)來實(shí)現(xiàn)函數(shù)重載
立即執(zhí)行函數(shù)表達(dá)式是什么曹洽?有什么作用
- 用()運(yùn)算符
- (function(){}());
- (function(){})();
- 一是不必為函數(shù)命名,避免了污染全局變量辽剧;
- 二是IIFE內(nèi)部形成了一個(gè)單獨(dú)的作用域梆惯,可以封裝一些外部無法讀取的私有變量彰阴。
什么是函數(shù)的作用域鏈
- 函數(shù)對象的一個(gè)內(nèi)部屬性[scope]包含了函數(shù)被創(chuàng)建時(shí)的作用域中對象的集合祭示,這個(gè)集合被稱為函數(shù)的作用域鏈败徊。
- 函數(shù)創(chuàng)建時(shí),它的作用域鏈中會填入一個(gè)全局對象撞羽,該全局對象包含了所有全局變量环凿。
- 函數(shù)執(zhí)行時(shí)會創(chuàng)建一個(gè)稱為“運(yùn)行期上下文(execution context)”的內(nèi)部對象,運(yùn)行期上下文定義了函數(shù)執(zhí)行時(shí)的環(huán)境放吩。每個(gè)運(yùn)行期上下文都有自己的作用域鏈智听,用于標(biāo)識符解析,當(dāng)運(yùn)行期上下文被創(chuàng)建時(shí)渡紫,而它的作用域鏈初始化為當(dāng)前運(yùn)行函數(shù)的[[Scope]]所包含的對象到推。
- 這些值按照它們出現(xiàn)在函數(shù)中的順序被復(fù)制到運(yùn)行期上下文的作用域鏈中。它們共同組成了一個(gè)新的對象惕澎,叫“活動對象(activation object)”莉测,該對象包含了函數(shù)的所有局部變量、命名參數(shù)唧喉、參數(shù)集合以及this捣卤,然后此對象會被推入作用域鏈的前端。
- 當(dāng)運(yùn)行期上下文被銷毀八孝,活動對象也隨之銷毀董朝。
在函數(shù)執(zhí)行過程中,每遇到一個(gè)變量干跛,都會經(jīng)歷一次標(biāo)識符解析過程以決定從哪里獲取和存儲數(shù)據(jù)子姜。該過程從作用域鏈頭部,也就是從活動對象開始搜索楼入,查找同名的標(biāo)識符哥捕,如果找到了就使用這個(gè)標(biāo)識符對應(yīng)的變量牧抽,如果沒找到繼續(xù)搜索作用域鏈中的下一個(gè)對象,如果搜索完所有對象都未找到遥赚,則認(rèn)為該標(biāo)識符未定義扬舒。函數(shù)執(zhí)行過程中,每個(gè)標(biāo)識符都要經(jīng)歷這樣的搜索過程凫佛。