標籤:span 命名 strong 儲存 包含 var java logs code
這兩天在讀《JavaScript語言精粹》關於第4章函數調用的幾種模式琢磨了半天。
這裡就說一下方法調用模式跟函數調用模式。
方法調用模式:
當一個函數被儲存為對象的一個屬性時,我們稱它為一個方法。當一個方法被調用時,this被綁定到該對象。如果調用運算式包含一個提取屬性的動作(a.name或a[name]),那麼他就是被當做一個方法調用。
1 var myObject = {2 value:1,3 double:function(){ //double是myObject對象的一個方法4 this.value = this.value*2;5 }6 };7 myObject.double(); //2
函數調用模式:
當一個函數並非一個對象的屬性時,那麼他就是被當做一個函數來調用的:
此時要注意,以此模式調用函數時,this被綁定到全域對象。
1 var myObject = { 2 value:1 3 }; 4 myObject.double =function () { 5 var helper = function () { //helper不是對象的屬性,因此this指向全域對象Window 6 this.value = this.value*2; 7 } 8 helper(); 9 } ;10 myObject.double(); //1,value的值不會發生改變
我們可以為該方法double定義一個變數,並賦值為this,那麼內建函式就可以通過那個變數訪問到this。按照約定,我們把那個變數命名為that:
1 var myObject = { 2 value:1 3 }; 4 myObject.double = function () { 5 var that = this; //定義變數that,並給它賦值為this 6 var helper = function () { 7 that.value = that.value*2; 8 } 9 helper();10 }11 myObject.double(); //2,由於間接的訪問了this,value最終發生了改變
JavaScript 方法調用模式和函數調用模式