JavaScript中關鍵字(this)
//測試瀏覽器 chrome;
- 我的錯誤認識;
- 我一直以爲this指代的是函數本身,當時寫公用方法時,就用了this這個關鍵字,自己也不知道爲什麼要用,只是看到老師在用,自己就用了。一直以來概念都很模糊,直到現在還不是很清楚,只是把自己知道的總結下來,如有錯誤請指出,以免誤人誤己。謝謝!
- 默認綁定(default binding);
- 大家在控制檯輸入
this
這個關鍵字。可以看到輸出的是window
對象。 - 那是不是
this===window
?console.log(this===window)//true
; - 從上面兩點大家看出什麼了沒?對的,
this
其實在默認的情況下創建的是全局變量;
- 大家在控制檯輸入
function foo(){
this.name = 'zs';
this.age = 18;
}
foo();
console.log(age)//output:18
- 隱式綁定(implicit binding);
- 從列子裏可以看出
this
指代的是b
; - 結合default/implicit,可以看出
this
在函數裏是代表全局變量,在Object時代表的是object;(不知道這樣說對不?)
- 從列子裏可以看出
var b = {
age:'20',
obj:function(){
console.log(this.age)//20
console.log(this===b)//true
console.log(this===Object)//false
}
}
b.obj()
- 顯示綁定(explicit binding);
- 通過call()和apply(),來指定作用域;(可以這麼說不?)
var age = 5;
function foo(){
console.log(this.age)//20
}
var b = {
age:'20'
}
foo.apply(b)
- new 綁定(new binding);
var age = 5;
function foo(age){
this.age = age;
}
console.log(new foo(20))//20
- 優先級的比較;
- explicit and implicit;
2.其它的就自己動手比較吧;
- explicit and implicit;
function foo(){
console.log(this.age);
}
var obj1 = {
age:'18',
foo:foo
}
var obj2 = {
age:'20',
foo:foo
}
obj1.foo();//18
obj2.foo();//20
obj1.foo.call(obj2);//20
obj2.foo.call(obj1);//18
//可以看出顯式綁定高於隱式綁定;