javascript高階程式設計知識點總結(4)

2021-07-05 06:12:04 字數 2857 閱讀 3200

函式表示式

一、定義函式的方式:

1.函式宣告

語法:function myfun(arg0,arg1,arg2)

重要特徵:

函式宣告提公升,即:可以把函式宣告放在呼叫它的語句後面。

2.函式表示式

語法(有幾種不同的語法形式,這裡列出的是最常見的一種):

var myfun = function(arg0,arg1,arg2);

//類似變數賦值語句,這裡的函式時匿名函式

函式表示式與其他表示式一樣,使用前必須先賦值。

二、遞迴

1.一般的遞迴寫法會導致的錯誤:

function factorial(num)else

}var anothe***ctorial=factorial;

factorial=null;

alert(anothe***ctorial(4));//出錯

解釋(個人理解):

函式名是乙個指向記憶體空間的指標,var anothe***ctorial=factorial,令anothe***ctorial也指向factorial指向的記憶體空間,也就是說,這時,這兩個函式(也即兩個指標)指向同一塊記憶體空間。當factorial被置為null,該指標被銷毀。呼叫anothe***ctorial,執行到函式內部,num*factorial(num-1)時,由於factorial()已經不存在,因此出錯。

2.上述錯誤避免

function factorial(num)else}

或使用命名函式表示式達成相同的結果:

var factorial=(function f(num)else

});關於函式賦值的通俗理解:

"var anothe***ctorial=factorial;"的作用相當於建立了名為anothe***ctorial函式,並且,該函式的函式體與factorial函式完全相同。即,函式anothe***ctorial如下:

function anothe***ctorial(num)else}

三、閉包

注意區分匿名函式和閉包!

匿名函式:沒有函式名稱的函式。 閉包

:有權訪問另乙個函式作用域中的變數的函式。

區別:一般,當函式執行完畢後,區域性活動物件會被銷毀,記憶體中僅儲存全域性作用域,但閉包的情況是不一樣的。當包含閉包的函式執行完畢後,它自己執行環境的作用域鏈會被銷毀(銷毀的只是作用域鏈,也就是那個指標),但它的活動物件依然留在記憶體中,原因是,閉包執行環境的作用域鏈引用了外部函式的活動物件,因此它不被銷毀。直到作為閉包的匿名函式被銷毀後,它的外部函式的活動物件才被銷毀。

建立閉包的方式:就是在乙個函式內部建立另乙個函式。

理解作用域鏈:當某個函式被呼叫時,會建立乙個執行環境及相應的作用域鏈。然後,使用arguments和其他命名引數的值來初始化函式的活動物件。但在作用域鏈中,外部函式的活動物件始終處於第二位,外部函式的外部函式的活動物件始終處於第三位......直至作為作用域鏈終點的全域性執行環境。

例如:function compare(value1,value2)else if(value1>value2)else

}var result=compare(5,10);

當呼叫compare()時,會建立乙個包含arguments、value1、value2的活動物件。全域性執行環境的變數物件(包含result和compare)在compare()執行環境的作用域鏈中則處於第二位。

全域性變數物件始終存在,而像compare()函式這樣的區域性環境的變數物件,則只在函式執行的過程中存在。

(每個變數物件,都包含一些變數,如:全域性變數物件包含result、compare兩個變數)

在建立compare()函式時,會建立乙個預先包含全域性變數物件的作用域鏈,這個作用域鏈被儲存在內部的[[scope]]屬性中。當呼叫compare()時,會為函式建立乙個執行環境,然後通過複製函式的[[scope]]屬性中的物件,構建起執行環境的作用域鏈。

作用域鏈本質上是乙個指向變數物件的指標列表,它只引用但不實際包含變數物件。

1.閉包與變數

!注意:

如前所述,

作用域鏈的這種配置,使得閉包只能取得包含函式中任何變數的最後乙個值。

舉例說明:

function createfunctions();

}return result;

}結果:返回10個10

原因:每個匿名函式都存有乙個指向createfuntions()活動物件的作用域鏈,result和i是createfuntions()活動物件中包含的兩個變數。因此,當createfuntions()函式返回後,i的值是10,由於十個匿名函式指向的是同乙個活動物件,因此共享該物件包含的變數,所以,返回的都是10。

改進上述**:

function createfunctions();

}(i);

}return result;

}2.關於this物件

var name="the window";

var object=;}};

alert(object.getnamefunc()()); //"the window"(在非嚴格模式下)

(1)由於getnamefunc()返回乙個函式,因此呼叫object.getnamefunc()()就會立即呼叫它返回的函式,結果就是返回乙個字串。

(2)每個函式在被呼叫時都會自動取得兩個特殊變數:this和arguments。內部函式在搜尋這兩個變數時,只會搜尋到其活動物件為止,因此永遠不可能直接訪問外部函式中的這兩個變數。

上述**變形:

var name="the window";

var object=;}};

alert(object.getnamefunc()()); //"my object"

JavaScript高階程式設計

ecmascript有5種基本型別資料 另外還有一種複雜的資料型別 typeof就是用來檢測變數的資料型別的,typeof可能會返回以下值 typeof操作符在檢測引用型別的值時,總是會返回object,所以用處不大。instanceof用來檢測物件型別的,返回值是 true false。例如 pe...

JavaScript高階程式設計 this

在函式中this到底取何值,是在函式真正被呼叫執行的時候確定的,函式定義的時候確定不了 因為this的取值是執行上下文環境的一部分,每次呼叫函式,都會產生乙個新的執行上下文環境。所謂建構函式就是用來new物件的函式。其實嚴格來說,所有的函式都可以new乙個物件,但是有些函式的定義是為了new乙個物件...

javascript 高階程式設計 二

這裡我們直接進入主題 在js剛剛開始的時候,必須面臨乙個問題,那就是如何使的js的載入和執行不會影響web核心語言html的展示效果,和html和諧共存。在這個背景下 2 xhtml中的應用 在html中如果字串,那麼html就會認為js指令碼已經結束所以會產生乙個錯誤用一下 來替換 來替換aler...