JavaScript入門(三):JS函數

JS函數
函數也是一個對象,對象能做的事他都可以做
不同於普通對象的是,在函數中可以保存一些可以執行的代碼語句,並且在需要時對這些代碼進行調用
- 基本語法
- 函數的創建:
1. 以函數聲明的方式
function 函數名([形參1,形參2,…..形參N]) {
代碼語句…
代碼語句…
}
2. 以函數表達式的方式
var 函數名 = function([形參1,形參2,…..形參N]) {
代碼語句….
代碼語句….
};
- 使用typeof檢查一個函數對象時會返回function,function 是一種特殊的對象類型
- 函數的調用:
函數調用就是將函數中封裝的代碼執行
語法如下
函數對象()
例如:sum(512, 1024);
- 參數
實參&形參:
- 形參(形式參數)
函數聲明和定義時使用的變量稱爲形參,形參的目的是用來接收調用該函數時傳遞的值
- 實參(實際參數)
函數調用時使用的變量稱爲實參,實參必須是一個確定的值,以便將這些值傳遞給形參
回調:
函數的參數可以是任意數據類型,
需注意的是當參數爲函數對象時,我們稱該函數對象爲回調函數。
回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應
- 返回值
返回值就相當於函數的執行結果,在函數執行完畢以後可以通過一個變量來接收返回值
通過 return 關鍵字來指定函數的返回值,比如:return 250;
- 立即執行函數
(function(){})()
這種格式的函數,稱爲立即執行函數,聲明完成後會立即被調用,且只會執行一次
- 作用域(難點)
作用域:
作用域簡單來講就是變量的作用範圍,在JS中作用域分成兩種:全局作用域和函數作用域
- 全局作用域(global scope)
全局作用域在頁面打開時創建,在頁面關閉時銷燬,所有在script標籤中直接編寫的內容都在全局作用域中
在全局作用域中創建的變量和函數,在頁面中的任意位置都可以訪問
在全局作用域中有一個全局對象window,window代表的是整個的瀏覽器的窗口
在全局作用域中創建的變量都會作爲window對象的屬性保存;
在全局作用域中創建的函數都會作爲window對象的方法保存
- 函數作用域
每調用一次函數就會創建一個新的函數作用域,函數作用域在函數調用時創建,在函數調用結束時銷燬
在函數作用域中可以訪問全局變量,在全局作用域中無法訪問函數作用域中的變量
當在函數作用域中使用一個變量時,它會先在自身中尋找,如果找到了則直接使用;
如果沒有找到,則繼續向上一級作用域中尋找,如果找到了則使用,沒找到則繼續;
直到找到全局作用域了,如果依然沒有,則會報錯。
函數尋找變量的範圍形成了一個作用域鏈(scope chain)
聲明提前:
在全局作用域中或函數作用域中,如果使用var關鍵字聲明瞭變量,則變量的聲明操作將會在所有的代碼執行前進行,但是不會賦值
在全局作用域中或函數作用域中,如果使用函數聲明的形式創建函數,則函數會在當前作用域中的代碼執行前被創建
1. JS檢查裝載階段
函數的形參 -> 變量聲明 | 函數聲明(優先)
2. JS執行階段
函數賦值 -> 變量賦值
閉包:
所謂的閉包就是當函數在其它地方使用的時候能保存下函數所需要的運行環境,也即是函數能保存下函數誕生時的環境
因此,閉包函數運行在它們被定義的作用域裏,而不是它們被執行的作用域裏
this:
- 這是一個函數調用中隱含的參數,代表的是函數執行的上下文對象,即方法的調用者!
- 在JS中,根據函數的調用方式不同,this的值也不同
1.以函數形式調用時,this是window對象【 ! 】
內嵌函數作爲代碼語句調用執行,因此,它的調用者也是window對象
2.以方法的形式調用時,this是調用方法的對象
3.以構造函數的形式調用時,this是新創建的那個對象
- 構造函數
- 構造函數是專門用來創建對象的函數,它本質上就是一個普通的函數,但是調用時需要使用new關鍵字
- 構造函數的執行流程:
1. 創建一個新的對象
2. 將新的對象設置函數的this
3. 執行函數中的代碼
4. 將新建的對象作爲返回值返回
通過一個構造函數創建的對象,我們稱這個對象是這個構造函數(類)的實例
通過相同的構造函數創建的對象,我們稱爲一類對象
使用 instanceof 運算符可以用來檢查一個對象是否是一個類的實例
- 原型
- 原型對象(prototype)
1. 每一個函數中都有一個默認屬性prototype,該屬性對應着一個【原型對象】
2. 如果函數作爲普通函數調用時,則該對象沒有任何作用
3. 如果函數作爲構造函數調用時,則使用該函數所創建的對象中,都會有一個隱含的屬性proto指向該函數的prototype對象
4. 默認情況下,所有的通過同一個構造函數所創建的對象,它們的原型對象是相同的
- 原型對象的作用:
- 當我們調用對象中的一個屬性或一個方法時,它會先在對象自身中尋找,如果有則直接使用;
- 如果沒有則去對象的原型中尋找(proto),如果找到了則使用;
- 如果沒找到則去對象的原型的原型中尋找(proto.proto),以此類推;
- 直到找到Object的原型,它的原型沒有原型(即爲NULL),如果依然沒有找到,則返回undefined。
- 原型鏈:
原型鏈是針對構造函數的。如上所述,對象查找某個指定的屬性或方法時,始終遵循原型向上查找的規則,這樣查找的範圍就形成一個原型鏈(prototype chain)
原型鏈可以間接實現類的屬性與方法的繼承效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章