(1)總是代表著它的直接調(diào)用者,如obj.fn,fn里的最外層this就是指向obj
(2)默認(rèn)情況下,沒有直接調(diào)用者,this指向window
(3)嚴(yán)格模式下(設(shè)置了'use strict')赃泡,this為undefined
(4)當(dāng)使用call,apply乘盼,bind(ES5新增)綁定的升熊,this指向綁定對象
全局環(huán)境
- 在全局環(huán)境下(瀏覽器),即在函數(shù)體外部绸栅,this 都指向全局對象
// 瀏覽器環(huán)境下測試如下:
a = 22
22
window.a
22
this.zs = 'zs'
"zs"
window.zs
"zs"
函數(shù)體內(nèi)部
- 在函數(shù)體內(nèi)部级野,在嚴(yán)格模式和非嚴(yán)格模式下,this 代表的不同含義
function f1(){
"use strict"; // 嚴(yán)格模式下
return this;
}
//在瀏覽器中:
f1() === undefined
輸出:true
function f2(){
return this; // 非嚴(yán)格模式下
}
//在瀏覽器中
f2() === window
輸出:true
------------------------------------------------------------------------------------------------
function zs() {
"use strict";
this.a = 1
}
zs()
輸出:VM995:3 Uncaught TypeError: Cannot set property 'a' of undefined粹胯,
即:this沒有執(zhí)行環(huán)境
function zs1() {
this.a = 1
}
zs1()
window.a
輸出:1
備注:在函數(shù)體內(nèi)使用嚴(yán)格模式蓖柔,this 為undefined, 在非嚴(yán)格模式下,this指向外部window對象(瀏覽器模式下)
- 為了將this從一個環(huán)境中轉(zhuǎn)移到另外一個環(huán)境上风纠,call() , apply()况鸣,兩者的作用一樣,只是傳參數(shù)不一樣竹观。
func1.call(this, arg1, arg2)
func1.apply(this, [arg1, arg2])
備注: this 是你想指定的上下文镐捧,他可以任何一個 JavaScript 對象(JavaScript 中一切皆對象),例如下方中的obj1
var obj = {
a: 1,
zs: function() { return this.a }
}
var obj1 = {a: 22}
obj.zs.call(obj1) // 將函數(shù)obj.zs()中的this指向了 obj1中
輸出:22
-------------------------------------------------------------------------
function zs (a, b) {
return a + b
}
function zs1 (a, b) {
return a - b
}
zs.call(zs1,1,2)
3
zs.apply(zs1, [1,2])
3
對象的方法中 this 指向?qū)ο蟊旧?/p>
let a = 222
let obj = {
a: 1,
zs: function () {
return this.a
}
}
obj.zs()
1 // obj調(diào)用了zs() 方法臭增,因此this指向了obj愤估,
ES6箭頭函數(shù):箭頭函數(shù)中的this是在定義函數(shù)的時候綁定,而不是在執(zhí)行函數(shù)的時候綁定
var a = 22 // 這邊如果使用 let a = 22 , obj.zs() 輸出 undefined速址,可能是作用域問題
var obj = {
a: 1,
zs: () => { console.log(this.a) },
zs1:function () { console.log(this.a) }
}
obj.zs() ===> this指向 Window 對象 ,輸出22
obj.zs1() ===> this指向 obj 對象由驹, 輸出1