在js函數中,有一個特殊的對象this,this引用的就是函數執行的環境對象,當在全局作用域中的時候,this指向的對象就是window;
這裡getName函數的作用域是window,當我們直接調用該函數的時候,this指向的是window對象,所以this.name就成了window.name;而這裡我們將getName函數賦給對象obj時,this引用的是obj對象,此時this.name會轉換成obj.name;所以列印出來是「Jack」。
函數對象也有自己的屬性,如caller屬性,該屬性保存著調用當前函數的函數的引用,如果是在全局作用域中調用的函數,那它的值為null;
當我們調用test()函數的時候,test函數中調用了add函數,此時add函數中的add.caller就指向了test函數,所以這裡會把test函數的源碼列印出來。這裡為了代碼更便於維護,我們還可以使用之前我們學的arguments.callee.caller代替add.caller,效果是一樣的。
不過,在嚴格模式(strict mode)下,arguments.callee會導致錯誤;arguments還有另一個屬性caller,不過在嚴格模式下也會報錯,非嚴格模式下返回undefind。一般這兩個屬性很少使用。
大家都知道,函數是對象,所以每個函數都有自己的屬性和方法,例如length和prototype屬性,length屬性表示函數接收的命名參數的個數;
其中,最讓人難以理解的要數prototype屬性了,它保存了所有對象的實例方法和屬性。當我們創建引用類型以及實現繼承的時候,prototype屬性是最為關鍵的,該屬性不可枚舉,不能使用for in循環遍歷;由於prototype會牽扯到js中對象高級的應用,所以我們這裡就不再討論,以後會出相關的教程。
除了這兩個屬性為,函數還有兩個常用的方法:apply()和call();它們實質上用法是一樣的,只是各自傳遞的參數不同,都是在特定的作用域中調用函數然後改變this的指向;apply()方法接收兩個參數,一個是在其中運行函數的作用域,另一個是數組,而call()和apply()唯一不同的就是第二參數,它不是一個數組,而是把多個值逐一列出來:
call()的用法:
這裡我們注意到,它們的返回值其實都是一樣的,至於在工作中使用哪一個,根據代碼自身情況來定吧。
以上就是我對js中函數的部分總結,如果這篇文章對你有幫助,歡迎轉載,評論區留言。