javascript 函數不同於其他的語言,每個函數都是作為一個物件被維護和運行的。透過函數物件的性質,可以很方便的將一個函數賦值給一個變數或將函數傳遞為參數。在繼續講述之前,先來看看函數的使用語法: 以下是引用片段: function func1(…){…} var func2=function(…){…}; var func3=function func4(…){…}; var func5=new Function(); 複製代碼 程式碼如下: <br><br>// 1, 方法呼叫模式<BR>// 當一個函數被儲存為物件的一個屬性時,我們稱之它為該物件的一個方法,那麼this被綁定到該物件上<BR>var myObject={ <BR>name : "myObject" , <BR>value : 0 , <BR>increment : function(num){ <BR>this.value = typeof(num) === 'number' ? num : 0; <BR>return this; <BR>} , <BR>toString : function(){ <BR>return '[Object:' this.name ' {value:' this.value '}]'; <BR>} <BR>} <BR>alert(myObject.increment(10).increment(20).toString( )); // [Object:myObject {value:30}] <br><br><BR>// 2, 函數呼叫模式<BR>// 當一個函數並非一個物件的函數時,那麼它被當作一個函數來調用,this被綁定到全域物件上。這是語言設計的一個錯誤。倘若語言設計正確,當內部函數呼叫時,this應該仍然綁定到外部函數的this變數上<BR>var myObject={ <BR>name : "myObject" , <BR>value : 0 , <BR>increment : function(num){ <BR>this.value = typeof(num) === 'number' ? num : 0; <BR>return this; <BR>} , <BR>toString : function(){ <BR>return '[Object:' this.name ' {value:' this.value '}]'; <BR>}, <BR>getInfo: function(){ <BR>var self=this; <BR>return ( function(){ <BR>//return this.toString(); // 內部匿名函數中this指向了全域物件window,輸出[object Window] <BR>return self.toString(); // 定義一個變數selft並且給它賦值為this,那麼內部函數透過該變數存取指向該物件的this <BR>})(); <BR>} <BR>} <BR>alert(myObject.increment(10).increment( 20).toString()); // [Object:myObject {value:30}] <br><br><BR>// 3, 建構器呼叫模式<BR>// JavaScript是一門基於原型繼承的語言, 這表示物件可以直接從其他物件繼承屬性, 該語言是無類別的。 <BR>// 如果一個函數前面帶上new來調用,那麼將創建一個隱藏連接到該函數的prototype成員的新對象,同時this將會被綁定到構造函數的實例上。 <BR>function MyObject(name){ <BR>this.name = name || 'MyObject'; <BR>this.value=0; <BR>this.increment = function(num){ <BR>this.value = typeof(num) === 'number' ? num : 0; <BR>}; <BR>this.toString = function(){ <BR>return '[Object:' this.name ' {value:' this .value '}]'; <BR>} <BR>this.target = this; <BR>} <br><br>MyObject.prototype.getInfo = function(){ <BR>return this.toString(); <BR>} <br><br>// 同時建立一個MyObject.prototype對象,myObject繼承了MyObject.prototype的所有的屬性, this綁定到了MyObject的實例上<br><br>var myObject = new MyObject (); <BR>myObject.increment(10); <BR>alert(myObject.value); //10 <br><br>var otherObject = new MyObject(); <BR>otherObject.increment(20); <BR>alert(otherObject.value); //20 <br><br>alert(myObject.target===myObject); // ture <BR>alert(myObject.target.getInfo()); // [ Object:MyObject {value:10}] <br><br><BR>// 4, Apply 呼叫模式<BR>// JavaScript是一門函數式的物件導向程式語言,所以函數可以擁有方法。 函數的apply方法,如同該物件擁有此方法,此時this指向該物件。 <BR>// apply接收兩個參數,第一個是要綁定的物件(this指向的物件),第二個是參數陣列. <BR>function MyObject(name){ <BR>this.name = name || 'MyObject'; <BR>this.value = 0; <BR>this.increment = function(num){ <BR>this.value = typeof(num) === 'number' ? num : 0; <BR>}; <BR>this.toString=function(){ <BR>return '[Object:' this.name ' {value:' this.value '}]'; <BR>} <BR>this. target=this; <BR>} <BR>function getInfo(){ <BR>return this.toString(); <BR>} <BR>var myObj = new MyObject(); <BR>alert(getInfo.apply(getInfo.apply( myObj)); //[Object:MyObject {value:0}], this指向myObj <BR>alert(getInfo.apply(window)); //[object Window], this指向window <br><br><BR>// for and while <BR>function func(a,b){ <BR>alert(a); // 1 <BR>alert(b); // 2 <br><br>for(var i =0;i<arguments.length;i ){ <BR>alert(arguments[i]); // 1, 2, 1, 2, 3 <BR>} <br><br>var i=0; <BR>while(i<arguments.length){ <BR>alert(arguments[i]); // 1, 2, 1, 2, 3 <BR>i=i 1; <BR>} <BR>} <BR>func(1,2,3); <br><br>var i=0 <BR>for (i=0;i<=10;i ) { <BR>document.write("The number is " i "<br/>") <BR>} <br><br>