this 本文的參考
this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象,注意es6的箭頭函數(shù)中的this和function定義的this是有區(qū)別的,下面說的一般只適合function定義的this
-
重點(diǎn): 函數(shù)中this到底取何值息尺,是函數(shù)真正被調(diào)用時(shí)決定的域庇,而不是定義時(shí)決定嵌戈。this的取值時(shí)執(zhí)行環(huán)境的一部分覆积,每一次調(diào)用函數(shù),都有可能產(chǎn)生不同的執(zhí)行環(huán)境
下面用幾個(gè)例子來闡述:
- 構(gòu)造函數(shù)(構(gòu)造函數(shù)應(yīng)大寫字母開頭)
構(gòu)造函數(shù)就是用來new對(duì)象的函數(shù)熟呛,嚴(yán)格來說所有函數(shù)都可以new對(duì)象技健,但有些函數(shù)的定義就是為了new一個(gè)對(duì)象。
1.1 如果函數(shù)作為構(gòu)造函數(shù)使用惰拱,那么其中的this就代表它即將new出來的對(duì)象
function Foo() {
this.name = 'a';
console.log(this);
}
var f = new Foo(); //Foo {name: 'a'}
console.log(f.name); //a
1.2 上面僅限于new Foo()情況雌贱,即函數(shù)作為構(gòu)造函數(shù)的情況。如果直接調(diào)用Foo(), 而不是new Foo(), 情況就大不一樣
function Foo() {
this.name = 'a';
console.log(this);
}
Foo(); //Window {stop: function, open: function, alert: function, confirm: function, prompt: function…}
因?yàn)楹瘮?shù)是再window環(huán)境下直接調(diào)用而不是new一個(gè)對(duì)象偿短。
- 函數(shù)作為對(duì)象的一個(gè)屬性
2.1 如果函數(shù)作為對(duì)象的一個(gè)屬性欣孤,并在作為對(duì)象的一個(gè)屬性被調(diào)用時(shí),函數(shù)中this就指向該對(duì)象
var obj = {
name: 'a',
fn: function() {
console.log(this);
}
}
obj.fn(); //Object {name: "a", fn: function}
2.2 如果fn不是作為obj的一個(gè)屬性被調(diào)用
//代碼中fn函數(shù)被賦值到另一個(gè)變量中昔逗,并沒有作為obj的一個(gè)屬性調(diào)用
var obj = {
name: 'a',
fn: function() {
console.log(this);
console.log(this.x);
}
}
var f = obj.fn;
f(); //Window {stop: function, open: function, alert: function, confirm: function, prompt: function…}
//同時(shí)name為undefined降传,因?yàn)閣indow中沒定義name
函數(shù)作為call或者apply調(diào)用
當(dāng)函數(shù)被call和apply調(diào)用時(shí),this的值就時(shí)傳入的對(duì)象的值勾怒,詳細(xì)怎么用可以自行查資料全局和調(diào)用普通函數(shù)
4.1 在全局環(huán)境下婆排,this永遠(yuǎn)是window(瀏覽器情況下),
console.log(this == window); //window
4.2 普通函數(shù)在調(diào)用時(shí)笔链,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);
}
f();
}
}
obj.fn();// window
- 雖然f在函數(shù)內(nèi)部定義但它是作為一個(gè)普通函數(shù)調(diào)用段只,this指向window