大家都知道this在英文中就是指代詞,在英文中this指的是主人公,但是在javascript中就沒有那麼簡單,它在不同的地方會指代不同,總結起來有以下四種情況。
1. 函式預編譯過程this——>window
function test(){
var a= 123;
function b(){}
}
//預編譯
AO{
arguments:[1],
this:window,
c:1;
a:underfined,
b:function(){}
}
test(1);
2. 全域性作用域 this——>window
3. call/apply可以改變函式執行時this指向
function Person(age,name){
<!--this發生改變指向了obj-->
this.name = name;
this.age = age;
}
var person = new Person('deng',100);
var obj = {}
Person.call(obj,'cheng',300);
4. obj.func(); func()裡面this指向obj
var obj = {
a:function(){
console.log(this.name)
<!-- 誰呼叫a,this就代表誰 ,這裡的this就代表obj-->
},
name:'abc' ;
}
obj.a();
下面這段程式碼就可以很好的檢驗我們自己對於this指代問題有沒有掌握
var name = '222';
var a = {
name:"111",
say:function(){
console.log(this.name);
}
}
var fun = a.say;
fun();
//輸出222 全域性執行
a.say();
//輸出111
var b ={
name:"333",
say:function(fun){
fun();
//222(沒有人呼叫它,那就是預編譯,此時的this指向window)
}
}
b.say(a.say);
//所以在這裡輸出的是全域性變數222
b.say = a.say;
b.say();
//輸出333
這就是在JavaScript中this指代的四種不同情況。