this
關鍵字的使用
在JavaScript中使用this
關鍵字表示調用方法的對象,這與大部分面嚮對象語言是一樣的。但是由於call
、apply
、bind
等函數的影響,我們可以改變this
所代指的對象。
- 使用
call
或者apply
調用的函數中,this
代指傳入的第一個參數對象,如果傳入null
或者undefined
,則表示全局對象(window
)。 - 通過對象調用函數(方法),函數中的
this
表示調用該函數的對象。 - 單獨調用的函數中
this
表示全局對象。
var myObject = {
sayHello: function() {
console.log("Hi, my name is " + this.myName);
},
myName: "Rebecca"
};
var secondObject = {
myName: "Colin"
};
myObject.sayHello(); //"Hi, my name is Rebecca"
myObject.sayHello.call(secondObject); //"Hi, my name is Colin"
var myName = "the global object";
var sayHello = function() {
console.log("Hi, my name is " + this.myName);
};
var myObject = {
myName = "Rebecca"
};
var myObjectHello = sayHello.bind(myObject);
sayHello(); //"Hi, my name is the global object"
myObjectHello(); //"Hi, my name is Rebecca"
JavaScript可以在運行中爲對象動態添加函數,這樣也會導致this
代指的對象發生變化。
var myName = "the global object";
var sayHello = function() {
console.log("Hi, my name is " + this.myName);
};
var myObject = {
myName: "Rebecca"
};
var secondObject = {
myName: "Colin"
};
myObject.sayHello = sayHello;
secondObject.sayHello = sayHello;
sayHello(); //"Hi, my name is the global object"
myObject.sayHello(); //"Hi, my name is Rebecca"
secondObject.sayHello(); //"Hi, my name is Colin"
還有,不能直接給處於較深的名字空間的函數增加短引用,會導致this
變爲全局對象,但是可以對它所處的對象設置短引用。
var myNamespace = {
myObject: {
sayHello: function() {
console.log("Hi, my name is " + this.name);
},
myName: "Rebecca"
}
};
var hello = myNamespace.myObject.sayHello;
hello(); //"Hi, my name is undefined"
var obj = myNamespace.myObject;
obj.sayHello(); //"Hi, my name is Rebecca"
Tips
call
與apply
的區別是,apply
接收兩個參數:this
和函數的參數數組;而call
的第一個參數爲this
,但是後面是函數的參數列表。本文檔由長沙戴維營教育整理。