在這里主要主要解釋的都是函數(shù)中的this
js中的this代表的是當(dāng)前函數(shù)執(zhí)行的主體;
1.this是誰和函數(shù)在哪里定義的和執(zhí)行的都沒有關(guān)系克懊,那么怎么才能去區(qū)分this?(非嚴(yán)格模式)
(1)函數(shù)的執(zhí)行七蜘,首先我們先看函數(shù)前面有沒有“ . ”谭溉,如果有的話,“ . ”前面是誰橡卤,this就是誰扮念;如果沒有電的話,這時候this就是window碧库。
例:
function fn () {
console.log(this)
}
var obj = {fn: fn};
fn() //這時候fn里面的this就是window
obj.fn() // 這時候的this就是window
var obj1 = {
sum: function () {
fn() //這個fn里面的this還是window
}
}
obj1.sum() //這時候sum里面的this是obj1
(2)自執(zhí)行函數(shù)里面的this永遠(yuǎn)是window柜与。
(3)給元素的某一個函數(shù)綁定方法巧勤,當(dāng)事件觸發(fā)的時候,執(zhí)行對應(yīng)的函數(shù)旅挤,方法中的this是當(dāng)前函數(shù)踢关。
<button id='btn'>點擊</button>
<script>
function fn () {
console.log(this)
}
doucument.getElementById('btn').onclick = fn ; //當(dāng)點擊btn按鈕的時候fn中的this是#btn
</script>
(4)在構(gòu)造函數(shù)模式中伞鲫,類中(函數(shù)體中)出現(xiàn)的this.xxx = xxx中的this是當(dāng)前類的一個實例粘茄。
例:
function CreatePersonal (name, age) {
// 瀏覽器默認(rèn)創(chuàng)建了p1,這時候this就是指的p1
this.name = name;
this.age = age;
this.personal = function () {
console.log('name'+ this.name + ';' + 'age' + this.age)
}
}
var p1 = new CreatePersonal('ant', 35);
p1.personal()
(5)使用call/apply來改變this的指向(一旦遇到了上述四條都沒有用了)
2.嚴(yán)格模式下 ‘use strict’
(1)自執(zhí)行函數(shù)中的this永遠(yuǎn)是undefined
var obj = {
fn: (function () {
// this-> undefined
return function () {
// this -> obj
}
})(0)
};
obj.fn()
(2)方法執(zhí)行秕脓,看方法前面是否有‘.’柒瓣,有的話,‘.’前面是誰this就是誰吠架,沒有的話this就是undefined
var obj = function () {
fn: fn
};
function () {}
fn() // undefined
obj.fn() // this->obj
這時候我們發(fā)現(xiàn)嚴(yán)格模式下的this相對于非嚴(yán)格模式下的this主要區(qū)別在于: 相對于js代碼中沒有執(zhí)行主體的情況下芙贫,非嚴(yán)格模式下默認(rèn)都是window;但是在嚴(yán)格模式下傍药,沒有寫就是沒有執(zhí)行主體磺平,this指向的是undefined