在JavaScript中一共有4種調用模式: 函數調用模式 方法調用模式 構造器調用模式 間接調用模式,通過call()和apply()進行 1. 函數調用模式 普通函數調用模式,如: 在一個調用中, (1)每個參數表達式計算的結果作為實參傳遞給聲明函數時定義的形參; (2)this被綁定到全局變數 ...
在JavaScript中一共有4種調用模式:
- 函數調用模式
- 方法調用模式
- 構造器調用模式
- 間接調用模式,通過call()和apply()進行
1. 函數調用模式
普通函數調用模式,如:
function printProps(o){ …… } printProps({x:1});
在一個調用中,
(1)每個參數表達式計算的結果作為實參傳遞給聲明函數時定義的形參;
(2)this被綁定到全局變數
var myObject = {value:1}; value = 2; myObject.printProps = function(){ var printValue = function(){ console.log(this.value); };
printValue();
console.log(this.value); } myObject.printProps();
此時的運行結果是:
2 1
我們註意到,在printValue()函數在執行時,this.value值為2,也就是說,this指向的是全局對象,而不是myObject。
(3)返回值:函數的返回值成為調用表達式的值。I. 如果函數返回是解釋器到達結尾,也就是沒有執行到return XXX的語句。返回值為undefined。 II. 如果函數返回是因為接受器執行到return xxx語句,返回return之後的值。 III. 如果return語句後沒有值,即return,則返回undefined。
2. 方法調用模式
當一個函數被保存為對象的一個屬性時,稱為方法。
(1)參數和返回值的處理與函數調用一致;
(2)調用上下文this為該對象
function printValue(){ console.log(this.value); } var value=1; var myObject = {value:2}; myObject.m = printValue; //作為函數調用 printValue(); //作為方法調用 myObject.m();
運行結果為:
1 2
我們註意到,當調用printValue時,this綁定的是全局對象,列印全局變數value值1。但是當調用myObject.m()時,this綁定的是方法m所屬的對象Object,所以列印的值為Object.value,即2。
3. 構造器調用模式
如果函數或方法調用之前帶有new關鍵字,它就構成構造函數調用。如:
function F(){……} var o = new F();
(1)參數處理:一般情況構造器參數處理和函數調用模式一致。但如果構造函數沒用形參,JavaScript構造函數調用語法是允許省略實參列表和圓括弧的。
如:下麵兩行代碼是等價的。
var o = new Object(); var o = new Object;
(2)函數的調用上下文為新創建的對象。
function Base(value){ this.value =value; } var value =1; var o = new Base(2); console.log(value); console.log(o.value);
Base(3);
console.log(value);
console.log(o.value);
運行結果:
1 2
3
2
I. 第一次調用Base()函數是作為構造函數調用的,此時調用上下文this被綁定到新創建的對象,即o。所以全局變數value值不變,而o新增一個屬性value,值為2;
II. 第二次調用Base()函數是作為普通函數調用的,此時調用上下為this被綁定到全局對象,在瀏覽器中為window。所以全局對象的value值改變為3,而o的屬性值不變。
(3)構造函數通常不使用return關鍵字,返回值就是新對象。而如果構造函數顯示地使用return語句返回一個對象,那麼調用表達式值就為這個對象。如果構造函數使用return語句但沒有指定返回值或者返回一個原始值,則忽略返回值,同時使用新對象作為調用結果。
函數調用模式 | 方法調用模式 | 構造器調用模式 | 間接調用模式 | |
實參處理 | 參數表達式運行結果作為實參傳遞給函數形參 | 與函數調用模式一致 |
一般情況,與函數調用模式一致 但如果構造函數沒用形參,JavaScript構造函數調用語法是允許省略實參列表和圓括弧的 |
call()方法使用它自有的實參列表作為函數的實參 apply()方法要求以數組的形式傳入參數 |
調用上下文 | 指向全局變數 | 指向方法所屬的對象 | 指向新創建的對象 | 允許顯示的指定調用所需的this值,為call()或apply()中的第一個參數 |
返回值 |
I. 沒有執行到return語句,返回undefined II. 執行到return xxx語句,返回return之後的值 III. retrun後沒有值,返回undefined |
與函數調用模式一致 |
構造函數通常不使用return關鍵字,返回值就是新對象。 如果構造函數顯示地使用return語句返回一個對象,那麼調用表達式值就為這個對象。 如果構造函數使用return語句但沒有指定返回值或者返回一個原始值,則忽略返回值,同時使用新對象作為調用結果。 |