強調(diào):在函數(shù)中this到底取何值震檩,是在函數(shù)真正被調(diào)用執(zhí)行的時候確定的乃摹,函數(shù)定義的時候確定不了。因為this的取值是執(zhí)行上下文環(huán)境的一部分是目,每次調(diào)用函數(shù),都會產(chǎn)生一個新的執(zhí)行上下文環(huán)境标捺。
this的取值分四種情況:
1.構造函數(shù):所謂構造函數(shù)就是用來new對象的函數(shù)懊纳。嚴格來說,所有的函數(shù)都可以new一個對象亡容,但有些函數(shù)的定義是為了new一個對象嗤疯,而有些不是。另外注意闺兢,構造函數(shù)的函數(shù)名第一個字母大寫(規(guī)則約定)茂缚,例如:Object,Array屋谭,F(xiàn)unction等脚囊。
function Foo(){
this.name = 'xx',
this.age = 1988
console.log(this) //Foo {name:'xx',age:1988}
}
var f1 = new Foo();//new構造函數(shù)時this取值為它即將new出來的對象
function Foo() {
this.name = 'xx',
this.age = 1988,
console.log(this) //Window
}
Foo() //直接調(diào)用構造函數(shù)的時候this取值為window
在構造函數(shù)的prototype中桐磁,this代表什么悔耘??
function Fn() {
this.name = 'xx';
this.year = 1988
}
Fn.prototype.getName = function(){
console.log(this.name);
}
var f1 = new Fn();
f1.getName(); //xx
在Fn.prototype.getName函數(shù)中我擂,this執(zhí)行的是f1對象衬以。因此可以通過this.name獲取f1.name的值
其實缓艳,不僅僅是構造函數(shù)的prototype,即便是在整個原型鏈中泄鹏,this代表的也都是當前對象的值郎任。
2.函數(shù)作為對象的一個屬性
如果函數(shù)作為對象的一個屬性,并且作為對象的一個屬性被調(diào)用時备籽,函數(shù)中的this指向該對象舶治。
var obj = {
x:10;
fn:function() {
console.log(this); //Object(x:10,fn:function);
console.log(this.x) //10
}
}
obj.fn() //調(diào)用時this才取值
如果fn函數(shù)不作為obj的一個屬性被調(diào)用,
var obj = {
x:10;
fn:function(){
console.log(this) //window
console.log(this.x) //undefined
}
}
var fn1 = obj.fn;
fn1() //調(diào)用時this開始取值车猬。
如果fn函數(shù)被復制到另一個變量中霉猛,并沒有作為obj的一個屬性被調(diào)用,那么this的值就是window珠闰。
3.函數(shù)用call或者apply調(diào)用
當一個函數(shù)被call和apply調(diào)用時惜浅,this的值就取傳入的對象的值。
var obj = {
x:10
}
var fn = function(){
console.log(this); //Object {x:10}
console.log(this.x) //10
}
fn.call(obj) //調(diào)用時this才取值
4.全局或者調(diào)用普通函數(shù)
在全局環(huán)境下伏嗜,this永遠是window
普通函數(shù)在調(diào)用時坛悉,this也是window
var x = 10;
var fn = function(){
console.log(this) //window
console.log(this.x) //10
}
fn()承绸;
var obj = {
x:10裸影,
fn:function(){
function f(){
console.log(this) //window
console.log(this.x) //undefined
}
f();
}
}
obj.fn() //調(diào)用時this開始取值
雖然函數(shù)f是在obj.fn內(nèi)部定義的军熏,但是它仍然是一個普通函數(shù)轩猩,this指向window。