函數中的this與argument對象,以及argument中的callee與caller屬性

相關閱讀:https://segmentfault.com/a/1190000015438195javascript

相關閱讀: https://zhuanlan.zhihu.com/p/23804247java

相關閱讀: https://blog.csdn.net/qq20004604/article/details/53328724segmentfault

 

函數內部有兩個特殊的對象:this與arguments數組

【this】this引用的是函數執行的環境對象app

(1) 做爲對象屬性被調用函數

       此時,this指向調用該函數的對象objthis

(2) 做爲普通函數被調用spa

  此時,this指向全局做用域,非嚴格模式下this指向window,嚴格模式下this指向undefined.net

(3) 做爲構造函數被調用指針

  此時,this指的就是將要被new出來的新對象

(4) call()、apply()、bind()的應用 —— 做用:擴充做用域,優勢在於方法與對象不須要任何耦合關係!

       每一個函數都包含兩個非繼承而來的方法call()與apply(),這兩個方法的用途都是在特定的做用域中調用函數,實際上等於設置函數體內this對象的值。

       此外,ES5中還定義了一個bind()方法。

     【apply()方法】接受兩個參數,一個是在其中運行函數的做用域(即this),另外一個是參數數組

     【call()方法】接受多個參數,第一個也是this,其他參數直接傳遞該函數,而非放到一個數組中傳遞給call()

     【bind()方法】用於將當前函數和指定對象綁定,返回一個新的函數,當新函數被調用時,代碼會在指定對象的上下文中執行。

 

【arguments】 其中arguments是一個數組類對象,包含傳入函數的全部參數。

雖然arguments的主要用途是保存函數參數,

可是這個對象還有一個名叫【callee】的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數。 表示引用當前正在執行的函數,或者說是調用arguments.callee的函數對象的引用,它給匿名函數提供了一種自我引用的方式。

        (1) 這個屬性只有在函數執行時纔有效   

        (2) 它有一個length屬性,能夠用來得到形參的個數,所以能夠用來比較形參和實參個數是否一致,即比較arguments.length是否等於arguments.callee.length   

        (3) 它能夠用來遞歸匿名函數。

 

ES5中也規範化了另外一個函數對象屬性【caller】,這個屬性中保存着調用當前函數的函數的引用,若是是在全局做用域中調用當前函數,它的值爲null

        (1) 這個屬性只有當函數在執行時纔有用   

        (2) 若是在javascript程序中,函數是由頂層調用的,則返回null

相關文章
相關標籤/搜索