JavaScript中的this指向既可謂語言之精髓同時又是初學者的大坑才漆,最近在學習過程中經(jīng)歷了許多磕磕碰碰下翎,在此分享一下一些心得體會刁憋。
1. 最簡單的情況:函數(shù)中的this
我們看下面一個例子
var name = 'Window';
var person = {
name: 'Person',
greeting: function () {
console.log('Hi! I\'m ' + this.name + '.');
}
};
var greeting = person.greeting;
greeting(); // Output #1: Hi! I'm Window.
person.greeting(); // Output #2: Hi! I'm Person.
從這個最簡單的例子中可以看出珍昨,在最普通的情況下双揪,this所指的對象就是調(diào)用它的對象:#1中是window
动羽,#2中是person
。
2. this
的重定向
-
bind
綁定對象
有時候我們希望函數(shù)不論在何處調(diào)用都能表現(xiàn)得一致渔期,即this
始終指向同一個對象运吓,這時我們可以使用bind
來綁定該對象至函數(shù),如下:
var name = 'Window';
var person = {
name: 'Person',
greeting: function () {
console.log('Hi! I\'m ' + this.name + '.');
}
};
var greetingByPerson = person.greeting.bind(person);
greetingByPerson(); // Output: Hi! I'm Person.
雖然是在最外層調(diào)用(即被window
調(diào)用),但函數(shù)已被綁定至person
羽德,因此this
始終指向person
几莽。
-
call
與apply
傳入對象
有時候需要更靈活的使用函數(shù),需要在不同場合使this
指向不同的對象宅静,這時可以使用call
與apply
傳入對象章蚣,如下:
var name = 'Window';
var person = {
name: 'Person',
greeting: function () {
console.log('Hi! I\'m ' + this.name + '.');
}
};
var stranger= {
name:'Stranger'
};
greeting=person.greeting;
greeting.call(person); // Output #1: Hi! I'm Person.
greeting.apply(person); // Output #2: Hi! I'm Person.
greeting.call(stranger); // Output #3: Hi! I'm Stranger.
greeting.apply(stranger); // Output #4: Hi! I'm Stranger.
由于stranger
對象中沒有定義stranger.greeting
這一函數(shù),我們可以使用greeting.call(stranger)
這樣的方式來使this
指向stanger
姨夹;當然更多的時候這樣的通用函數(shù)可能會定義在外層而非某一對象內(nèi)纤垂。
apply
和call
的作用類似,其接受的第一個參數(shù)都是重定向的對象磷账,區(qū)別在于接收后面參數(shù)的方法: call
接受連續(xù)的多個參數(shù)而apply
接受一個數(shù)組峭沦。
注意: 在node.js
中執(zhí)行代碼時最外層的調(diào)用對象會變成undefine
而非瀏覽器中的window