基本作用:改變物件的執行上下文。
this指向執行上下文。(執行環境)
this指向的永遠是呼叫該方法的物件
function func()
**中方法執行後控制台輸出1
,由於func
是全域性物件window
下的乙個方法,那麼呼叫該方法的物件就應該是全域性物件window
,所以this
理論上指向的物件就應該是window
如果理論成立,而this.a==1
,也就是說變數a
是乙個全域性變數。在控制台上直接輸入a
或window.a
後回車,會發現輸出了1
,所以在func
這個方法中,this
的指向就是window。
eg:
var person =}person.who();
上面這段**中who
方法是person
物件的乙個屬性,被person
物件呼叫,所以this
的指向也就是person。
call()
function.call(obj, args1,args2,...)
只接收兩個引數,其中第二個引數必須是乙個陣列或者類陣列,這也是這兩個方法很重要的乙個區別
陣列與類陣列小科普
陣列我們都知道是什麼,它的特徵都有哪些呢?
可以通過角標呼叫,如array[0]
具有長度屬性length
可以通過 for 迴圈和foreach
方法進行遍歷
類陣列顧名思義,具備的特徵應該與陣列基本相同,那麼可以知道,乙個形如下面這個物件的物件就是乙個類陣列
var arraylike =
類陣列arraylike
可以通過角標進行呼叫,具有length
屬性,同時也可以通過 for 迴圈進行遍歷
我們經常使用的獲取dom節點的方法返回的就是乙個類陣列,在乙個方法中使用arguments
關鍵字獲取到的該方法的所有引數也是乙個類陣列
但是類陣列卻不能通過foreach
進行遍歷,因為foreach
是陣列原型鏈上的方法,類陣列畢竟不是陣列,所以無法使用。
相同點
都能夠改變方法的執行上下文(執行環境),將乙個物件的方法交給另乙個物件來執行,並且是立即執行
不同點
call
方法從第二個引數開始可以接收任意個引數,每個引數會對映到相應位置的func的引數上,可以通過引數名呼叫,但是如果將所有的引數作為陣列傳入,它們會作為乙個整體對映到func對應的第乙個引數上,之後引數都為空
function func (a,b,c) {}func.call(obj, 1,2,3)
// function接收到的引數實際上是 1,2,3
func.call(obj, [1,2,3])
// function接收到的引數實際上是 [1,2,3],undefined,undefined
// function接收到的引數實際上是 1,2,3
0: 1,
1: 2,
2: 3,
length: 3
})// function接收到的引數實際上是 1,2,3
由於可以改變this
的指向,所以也就可以實現物件的繼承。
function superclass ()}function subclass ()
subclass();
// 1
subclass
通過call
方法,繼承了superclass
的print
方法和a
變數,同時subclass
還可以擴充套件自己的其他方法。
call和apply方法的異同
相信很多前端小夥伴們在寫 的時候應該都用過call 這兩個方法,應該也對這兩個方法有個基本的了解。但肯定也有些小夥伴對它們不是很熟悉,那這次就來 一下這兩個方法 想要深入了解call 這兩個方法,那麼必須要先知道他們的基本作用 改變物件的執行上下文 我們在寫乙個方法的時候,總是會用到乙個關鍵字thi...
call和apply的異同
共同點 作用 呼叫乙個物件的乙個方法,以另乙個物件替換當前物件。將乙個函式的物件上下文從初始的上下文改變為由 thisobj 指定的新物件。如果沒有提供 thisobj 引數,那麼 global 物件被用作 thisobj。以call為例,語法 obj1.method1.call obj2,argu...
call與apply方法的異同
改變物件的執行上下文 什麼是執行上下文?我們在寫乙個方法的時候,總是會用到乙個關鍵字this,而this的指向就是我們這裡所說的執行上下文 執行環境 首先我們要知道,this指向的永遠是呼叫該方法的物件,如何證明this的指向就是當前物件呢?看下面這段 function func func 1 中方...