對JavaScript中函式物件的理解
首先,來看一個求兩個數的和的函式
function sum(num1,num2){
return num1 + num2;
};
alert(sum(1,2)); //3
這個函式很簡單,但是如果要求三個數的和呢,很容易會想到再加一個引數num3,同時將返回值也加上num3,那麼,求四個數的和,五個數的和呢?再用這種方式寫肯定是不行的,其實,js中的函式內部有一個物件叫做arguments,它是一個類陣列物件,裡面儲存著這個函式呼叫時傳入的引數:
function sum(){
alert(arguments.length);
}
sum(1,2); //2
function testArgs(){
alert(arguments[0]);
}
testArgs(4,5); //4
知道了auguments之後,可以把這個函式該寫成求任意個數字的和,只需要把這些數字傳入函式即可:
function sum(){
var sum = 0;
for(var i =0 ; i
再來看一個遞迴求和的例子,也就是通常我們見到的求1~n的和,最初的方法可以採用以下這種方式實現:
function sum(n){
if(n == 1){
return 1;
} else {
return n+sum(n-1);
}
}
alert(sum(5)); //15
有些時候由於命名衝突或者其他的一些原因,我們需要將函式重新命名,由於採用了遞迴,所以函式內部程式碼中的函式名也要修改,問題在於一個是要修改兩次,有些時候我們還會一遺忘..arguments物件有一個callee屬性,代表arguments物件屬於哪一個函式的,比如上面sum函式中arguments.callee就代表sum本身,所以,可以將程式碼修改成如下:
function sum(n){
if(n == 1){
return 1;
} else {
return n+arguments.callee(n-1);
}
}
alert(sum(5)); //15
現在,我們就不用去關心函式內部的程式碼了,降低了程式碼的耦合.
js是支援物件導向程式設計的,只是它沒有類這個概念,有一種常用的方式就是透過建構函式+原型的方式來實現:
function Box(name,age){
this.name = name;
this.age = age;
}
var box = new Box("xwc",20);
alert(typeof box); //"object"
alert(box instanceof Box); //true
首先寫一個很普通的函式Box(建構函式),它就相當於別的面嚮物件語言中的類,然後用new運算子來例項化一個Box,命名為box,現在box就是Box的一個例項,這點用instanceof可以證明(typeof 在檢測基本型別的時候拿手,檢測某個物件是誰的例項還是用instanceof吧),到這裡,我相信很多人關心這一切的背後到底發生了什麼,我查閱了一些資料,發現解釋是這樣的:使用new運算子之後,js引擎會在後臺建立一個空物件,然後把自己的作用域賦給建構函式,接著執行函式中的程式碼,(你也可以理解成這個物件呼叫了建構函式,所以this指向的是這個物件),最後返回這個物件。
其實,關於函式的東西還有很多,例如函式的apply呼叫,call呼叫還有原型,這裡一次描述完不太現實,另,由於本人水平有限,歡迎大家評論指錯交流。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2249/viewspace-2798051/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 理解 JavaScript 中的高階函式JavaScript函式
- TypeScript 中函式的理解?與 JavaScript 函式的區別?TypeScript函式JavaScript
- 我對JavaScript物件的理解JavaScript物件
- JavaScript 表單、物件、函式JavaScript物件函式
- JavaScript中的compose函式和pipe函式JavaScript函式
- JavaScript 函式引數解構物件JavaScript函式物件
- javascript 的函式宣告與表示式對比JavaScript函式
- JS函式,物件,例項方法,物件方法理解JS函式物件
- 深入理解 JavaScript 回撥函式JavaScript函式
- 理解Underscore中的_.bind函式函式
- 理解Python中的Lambda函式Python函式
- 理解Underscore中的flatten函式函式
- javascript函式中with的介紹JavaScript函式
- JavaScript中的函式繼承JavaScript函式繼承
- 《JavaScript物件導向精要》之二:函式JavaScript物件函式
- 深入理解javascript系列(十四):純函式JavaScript函式
- 理解 JavaScript 物件的屬性JavaScript物件
- 對javascript中的call()和apply()的理解JavaScriptAPP
- 理解Underscore中的節流函式函式
- 理解Underscore中的去抖函式函式
- jQuery的基本理解及核心函式與核心物件jQuery函式物件
- C++中函式指標與函式物件C++函式指標物件
- 輕鬆理解建構函式和原型物件函式原型物件
- (譯) JavaScript中的組合函式JavaScript函式
- javascript中generator函式的介紹JavaScript函式
- 理解 JavaScript Mutation 突變和 PureFunction 純函式JavaScriptFunction函式
- 深入理解javascript系列(十五):高階函式JavaScript函式
- 深入理解Javascript中的隱式呼叫JavaScript
- 《JavaScript物件導向精要》之四:建構函式和原型物件JavaScript物件函式原型
- JavaScript物件複製理解JavaScript物件
- 深入理解JavaScript物件JavaScript物件
- 閉包函式(匿名函式)的理解函式
- [譯] JavaScript中的函式柯里化JavaScript函式
- JavaScript中的函式過載(Function overloading)JavaScript函式Function
- 函式物件、物件、原型函式物件原型
- JavaScript碎片———函式閉包(模擬物件導向)JavaScript函式物件
- JavaScript建構函式,物件導向程式設計JavaScript函式物件程式設計
- 在 javascript 面試中對非同步的理解JavaScript面試非同步