js學習筆記 046 函式

2021-06-17 15:48:05 字數 2907 閱讀 4696

js,函式即物件,程式可以隨意操控它們。比如,js可以把函式賦值給變數,或者作為引數傳遞給其它函式。因為函式就是物件,所以可以給它們設定屬性,甚至呼叫它們的方法。

js的函式可以巢狀在其它函式中定義,這樣它們就可以訪問它們被定義時所處的作用域中的任何變數。這意味著js函式構成了乙個閉包,它給js帶來了非常強勁的程式設計能力。

函式宣告:

注意宣告式函式和函式表示式的區別,宣告式函式會把函式宣告提到指令碼和外部函式的頂部,所以這種宣告方式的函式,可以被在它定義之前出現的**所呼叫。函式表示式,要呼叫它,必須要能引用它,而要使用乙個以表達方式定義的函式之前,必須把它賦值給乙個變數。變數宣告提前,而變數賦值不會提前,所以,以表示式方式定義的函式在定義之前無法呼叫。

巢狀函式:

巢狀函式的有趣之處在於它的變數作用域規則:它們可以訪問巢狀它們的函式的引數和變數。

注意:宣告函式語句並非真正的語句,ecmascript規範只是允許它們作為頂級語句。它們可以出現在全域性**裡,或內嵌在其它函式中,但它們不能出現在迴圈、條件判斷,或者try/cache/finally以及with語句

中。以上僅限宣告式函式,如果是函式表示式,則可以出現在**的任何地方。

函式呼叫:

構成函式主體的js**在定義之時並不會執行,只有呼叫該函式時,它們才會執行。4

種方式呼叫

js函式:

1.        作為函式

2.        作為方法

巢狀函式不會從呼叫它的函式中繼承

this.

如果巢狀函式作為方法呼叫,其

this

的值指向呼叫它的物件。如果巢狀函式作為函式呼叫,

this

值不是全域性物件就是

undefined

。很多人誤以為呼叫巢狀函式時

this

會指向呼叫外層函式的上下文

方法鏈:當方法的返回值是乙個物件,這個物件可以再呼叫它的方法。這種方法呼叫序列中每次的呼叫結果都是另外乙個表示式的組成部分。

當方法並不需要返回值時,最好直接返回

this

。如果在設計的

api中

一直採用這種方式,使用

api就可以進行

」鏈結呼叫

」。此鏈式呼叫

不同於建構函式的鏈式呼叫

3.        作為建構函式

如果函式或方法前帶有關鍵字new,它就構成構造函式呼叫。構造函式呼叫與普通方法呼叫在實參處理,呼叫上下文,返回值方面都有所不同。

有引數:先計算實參表示式,然後傳入函式內,這和函式呼叫和方法呼叫是一致的。如果沒有引數,構造函式呼叫允許省略實參列表和圓括號。如下:

var obj = new  object();

var obj = new  object; //=>兩者等價!

建立新物件,並將這個物件用做其呼叫上下文,這個物件繼承自建構函式的prototype屬性。因此建構函式可以使用this關鍵字來引用這個新建立的物件。注意:儘管建構函式看起來像乙個方法呼叫,它依然會使用這個新物件作為呼叫上下文。也就是說,在表達new  o.m()中,呼叫上下文並不是o

建構函式並不使用return關鍵字,它們通常初始化新物件,當建構函式的函式體執行完畢時,它會顯式返回。在這種情況下,構造函式呼叫表示式的計算結果就是這個新物件的值。然而如果建構函式使用return顯式返回乙個物件那麼呼叫表示式值就是這個物件。如果建構函式使用return 沒有返回值或返回乙個原始值。那麼這時將忽略返回值,同時使用這個新物件作為呼叫結果。

進一步理解:

為什麼用new關鍵字構造出來的a,會獲得p這個屬性?new a()這行**做了什麼事情?根據上篇文章中function的建立過程第4步,a這個物件會有乙個construct屬性(注意不是constructor,consturct是ecmascript標準裡的屬性,好像對外不可見),該屬性的值是個函式,new a()即會呼叫a的這個construct函式。那麼這個construct函式會做些啥呢?

1, 建立乙個object,假設叫x。

2, 如果a.prototype是個object(一般都是),則把a.prototype賦給x.__proto__;否則(不常見),請大老闆object出馬,把object.prototype賦給x.__proto__。

3, 呼叫a.call(x),第乙個引數傳入我們剛剛建立的x。這就妥了,a的函式體裡this.p = 1,這個this,就成了x。因此x就有了p這個屬性,並且x.p = 1。

4, 一般情況下,就返回x了,這時a就是x了。但也有特殊情況,如果a的函式體裡返回的東西,它的型別(typeof)是個object。那麼a就不是指向x了,而是指向a函式返回的東西。

偽**如下:

var x = new object(); //事實上不一定用new來建立,我也不清楚。

x.__proto__ = a.prototype 

var result = a.call(x)

if (typeof(result) == "object")

return x;

5.        arguments物件的callee和caller屬性

callee在ecmascript標準規範中規定它所代表當前正在執行的函式

caller是非標準的,但大多數瀏覽器都實現了它個屬性它指代呼叫當前正在執行的函式的函式

通過caller屬性可以訪問呼叫堆疊。

js 函式(學習筆記)

建構函式 普通函式 匿名函式 閉包反正都是函式 放一起講吧 其實方法也是物件 js裡啥都是物件 物件是啥 物件是 帶有屬性和方法的特殊資料型別 比如 定義乙個物件 var main name girl func function alert 1 物件的屬性和方法 那普通函式 function add...

js學習筆記 connect函式

connect 函式 dojo.event.connect handlernode,eventname obj,handler 功能 為handlernode節點繫結事件監聽函式,當handlernode物件的 eventname被觸發時,obj的handler函式被觸發。handlernode可以...

前端js學習筆記 函式

函式使用分為兩步 宣告函式 和 呼叫函式 1.宣告函式 function 函式名 1 function是宣告函式的關鍵字,不能改動 2 函式不呼叫 自己不執行 2.呼叫函式 函式名 呼叫函式的時候一定要加小括號 3.函式的形參和實參 function 函式名 形參1,形參2 函式名 實參1,實參2 ...