函數(shù) 知識學(xué)習(xí)整理

一、函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別

函數(shù)聲明:
function 函數(shù)名稱 (參數(shù):可選){ 函數(shù)體 }
函數(shù)表達(dá)式:
function 函數(shù)名稱(可選)(參數(shù):可選){ 函數(shù)體 }

  • 若沒有函數(shù)名稱一定是函數(shù)表達(dá)式。
  • 若有函數(shù)名稱,如果函數(shù)function f(){}作為賦值表達(dá)式的一部分,則他是函數(shù)表達(dá)式,若function f(){}被包含在函數(shù)體內(nèi)或程序最頂部,則是函數(shù)聲明。
    function f(){} // 聲明,因?yàn)樗浅绦虻囊徊糠?br> var g = function f(){}; // 表達(dá)式,因?yàn)樗琴x值表達(dá)式的一部分
    new function f(){}; // 表達(dá)式,函數(shù)創(chuàng)建表達(dá)式
    (function(){
    function bar(){} // 聲明,因?yàn)樗呛瘮?shù)體的一部分
    })();
    (fuction(){})也是函數(shù)表達(dá)式, ()是一個(gè)分組操作符,它的內(nèi)部只能包含表達(dá)式
  • JavaScript 解釋器中存在一種變量聲明被提升(hoisting)的機(jī)制,變量(函數(shù))的聲明會(huì)被提升到作用域的最前面,即使寫代碼的時(shí)候是寫在最后面,也還是會(huì)被提升至最前面。而函數(shù)表達(dá)式如同定義其它基本類型的變量一樣,只在執(zhí)行到某一句時(shí)對其進(jìn)行解析。var函數(shù)表達(dá)式也會(huì)聲明,聲明式為給其賦值,所以alert(g)還是undefined。
    alert(f)// function f(){}
    alert(g)// undefined
    function f() {}
    var g = function fn() {};
    alert(f); // function f() {}
    alert(g); // function fn() {}

二、什么是變量的聲明前置?什么是函數(shù)的聲明前置

變量的聲明前置

console.log(a);//undefined
var a = 1;
console.log(a);//1
console.log(b);//錯(cuò)誤

console.log(a)為什么輸出undefined?原因是變量a聲明提前,先聲明var a;然后執(zhí)行完console.log(a);再給a賦值1,所以指為undefined。b沒有聲明也沒有初始化所以會(huì)出現(xiàn)錯(cuò)誤。

函數(shù)的聲明前置:
1.構(gòu)造函數(shù)

printName;// Invalid or unexpected token
var printName = new Function("console.log('Byron');");

構(gòu)造函數(shù)也是一個(gè)函數(shù)表達(dá)式,含有var也會(huì)聲明前置,但此時(shí)只是聲明未賦值會(huì)出現(xiàn)錯(cuò)誤。有意思的是將上面改一下。

 g;// 
var g = new Function("console.log('Byron');");
typeof(g);//function

這個(gè)時(shí)候確沒問題了,var聲明前置時(shí)可能將g作為一個(gè)變量聲明,然后將new Function的值賦給g,實(shí)際上創(chuàng)造了一個(gè)匿名函數(shù)。而new Function這個(gè)函數(shù)只是作為g的局部變量。當(dāng)對new Function檢查類型時(shí)就會(huì)出現(xiàn)錯(cuò)誤。
2.函數(shù)聲明

functionName();
function functionName(){
  console.log("我是函數(shù)聲明");
}

functionName();輸出"我是函數(shù)聲明",函數(shù)聲明會(huì)將函數(shù)function functionName(){}拿到最前面聲明一下,函數(shù)體的內(nèi)容聲明時(shí)是未執(zhí)行的。此時(shí)不會(huì)出現(xiàn)錯(cuò)誤。
3.函數(shù)表達(dá)式
構(gòu)造函數(shù)實(shí)際上就是函數(shù)表達(dá)式,類型差不多就不舉例了。

三、arguments 是什么

arguments是對象。
作用:可以通過arguments對象來訪問函數(shù)參數(shù)內(nèi)部數(shù)組,從而獲取傳遞給函數(shù)的每一個(gè)參數(shù)。通過arguments[]來獲取。
exp:參數(shù)內(nèi)第一個(gè)元素arguments[0]...

四、函數(shù)的重載怎樣實(shí)現(xiàn)

靜態(tài)語言中確定一個(gè)函數(shù)的手段是靠方法簽名——函數(shù)名+參數(shù)列表,也就是說相同名字的函數(shù)參數(shù)個(gè)數(shù)不同或者順序不同都被認(rèn)為是不同的函數(shù),稱為函數(shù)重載。
JavaScript中沒有函數(shù)重載,函數(shù)通過名字確定唯一性,參數(shù)不同也被認(rèn)為是相同的函數(shù),后面的覆蓋前面的。

function sum(x){
console.log(x+1);
}
function sum(x){
console.log(x+2);
}

sum(1);//結(jié)果為3;后面覆蓋前面。

五、立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用

立即執(zhí)行函數(shù)表達(dá)式結(jié)構(gòu):

(函數(shù)定義表達(dá)式)函數(shù)調(diào)用表達(dá)式
( function{} )();
(函數(shù)定義表達(dá)式 函數(shù)調(diào)用表達(dá)式)
( function{}() );

注意:當(dāng)函數(shù)執(zhí)行有命名沖突的時(shí)候,函數(shù)依次填入 變量=》函數(shù)=》參數(shù)
的順序。
作用:
1.JavaScript中沒有命名空間,而且只有function代碼塊內(nèi)部可以隔離變量作用域,自調(diào)用匿名函數(shù)就用來防止變量彌散到全局,以免各種js庫沖突。
2.JS里沒有入口函數(shù)的概念,在現(xiàn)今的模塊化方案成熟穩(wěn)定之前,立即執(zhí)行函數(shù)也常常用來充當(dāng)主函數(shù)的角色。
3.IIFE寫惰性載入。如何實(shí)現(xiàn)?

六、什么是函數(shù)的作用域鏈

作用域(scope):變量和函數(shù)的作用域是在定義時(shí)決定而不是執(zhí)行時(shí)決定,當(dāng)定義了一個(gè)函數(shù),當(dāng)前的作用域鏈就保存起來,并且成為函數(shù)的內(nèi)部狀態(tài)的一部份。在最頂級作用域鏈僅由全局對象組成,而不和詞法作用域相關(guān),然而,當(dāng)定義一個(gè)嵌套的函數(shù)時(shí),作用域鏈就包括外面的包含函數(shù)。這意味著嵌套函數(shù)可以訪問包含函數(shù)的所有參數(shù)和局部變量。盡管當(dāng)一個(gè)函數(shù)定義時(shí)作用域鏈就固定了,但作用域鏈中定義的屬性還沒有固定。作用域鏈?zhǔn)腔畹?,并且函?shù)被調(diào)用時(shí),可以訪問任何當(dāng)前的綁定。
作用域鏈(scope chain):存儲(chǔ)變量對象的集合(環(huán)境棧?),保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問,也就是用于標(biāo)識符解析(變量訪問)。
執(zhí)行環(huán)境(execution context):定義了變量和函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們的各自行為。每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對象。在web瀏覽器中,window對象就是全局執(zhí)行環(huán)境。每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境,當(dāng)函數(shù)執(zhí)行完畢,該環(huán)境被銷毀,保存在其中的變量和函數(shù)也隨之銷毀

1.函數(shù)的作用域鏈的理解 2.理解 JavaScript 作用域和作用域鏈

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,677評論 0 4
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,690評論 9 118
  • 繼承 一、混入式繼承 二、原型繼承 利用原型中的成員可以被和其相關(guān)的對象共享這一特性,可以實(shí)現(xiàn)繼承,這種實(shí)現(xiàn)繼承的...
    magic_pill閱讀 1,128評論 0 3
  • Live撤出后,好久不寫,搬到X浪之后每個(gè)新年到來的時(shí)候或多或少總會(huì)發(fā)一個(gè)表達(dá)自己還是有獨(dú)立思維的人。 13年有時(shí)...
    謝鎮(zhèn)的動(dòng)物園閱讀 635評論 0 1
  • 比較·GTD·可調(diào)式預(yù)案 標(biāo)準(zhǔn)GTD強(qiáng)調(diào)流程,對意外的容忍度太小??赡苓m合工作穩(wěn)定的人群,但對自由度需求高的人群就...
    wnight閱讀 588評論 0 0

友情鏈接更多精彩內(nèi)容