如上兩種所示,目前的執行環境都是window,直接的去調用
函數調用模式很簡單,是最基本的調用方式。 但是同樣的是函數,将其指派給一個對象的成員以後,就不一樣了. 将函數指派給對象的成員後,那麼這個就不在稱為函數,而應該叫做方法. 其可以看做為目前對象的方法,如果目前對象是類(可以看作為靜态方法,我的了解)
類似的情況,和上面的差不多
同樣是函數,在單純的函數模式下,this 表示 window。
在對象方法模式下,this 指的是目前對象。
除了這兩種情況,JavaScript 中函數還可以是構造器
将函數作為構造器來使用的文法就是在函數調用前面加上一個 new 關鍵字。
這裡的this指向對象本身
所有需要由對象使用的屬性,必須使用 this 引導。
函數的 return 語句意義被改寫,如果傳回非對象,就傳回this。
首先定義了函數Person,當程式執行到這裡時不會執行函數體,是以 JavaScript 的解釋器并不知道這個函數的内容。
接下來執行new關鍵字,建立對象,解釋器開辟記憶體,得到對象的引用,将新對象的引用交給函數
緊接着執行函數,将傳過來的對象引用交給this。也就是說,在構造方法中,this 就是剛剛被 new 建立出來的對象。
然後為 this 添加成員,也就是為對象添加成員。
最後函數結束,傳回 this,将 this 交給左邊的變量。
分析過構造函數的執行以後,可以得到,構造函數中的 this 就是目前對象。
在構造函數中 return 的意義發生了變化。
首先如果在構造函數中,如果傳回的是一個對象,那麼就保留原意。
如果傳回的是非對象比如數字、布爾和字元串。那麼就傳回this。
如果沒有 return 語句,那麼也傳回 this。
例子:傳回新的對象
例子:傳回其他或者不傳回
除了上述三種調用模式以外,函數作為對象還有 apply 方法與 call 方法可以使用,這便是第四種調用模式。
因為函數本身就是對象擁有自己的方法。
例子1:XXX.apply(null) 無參數
例子2:傳入新建立的對象
JQuery中剛剛開始的時候有很多的變量,代表相應的函數,就是如下這樣調用的。
在javascript OOP中,定義一個類.
主要的目的就是為了重用,修改了目前的執行環境而已。
但是如果我們有一個對象 var dog = {food:”bone”},我們不想對它重新定義say方法,
那麼我們可以通過call或apply用cat的say方法:cat.say.call(whiteDog);
是以,可以看出call和apply是為了動态改變this而出現的,當一個object沒有某個方法,但是其他的有,我們可以借助call或apply用其它對象的方法來操作。
用的比較多的,通過document.getElementsByTagName選擇的dom
節點是一種類似array的array。
它不能應用Array下的push,pop等方法。
我們可以通過:
var domNodes = Array.prototype.slice.call(document.getElementsByTagName(“*”));
這樣domNodes就可以應用Array下的所有方法了。
https://www.zhihu.com/question/20289071
http://www.jb51.net/article/49230.html