前言: 一直都搞不清javascript中this的指向,你不知道的javascript(上卷)這本書中有3章都是在講解this,去年第一次看完仍是以爲似懂非懂的,一深刻的問仍是不清楚,如今在看一遍,真心以爲這本書裏講的是真好,想深刻了解一下的,這本書是一個不錯的選擇.javascript
下面我就簡單的說一下個人理解,用兩句話記住了javascrpt中this的指向:html
函數的{}
構成做用域,對象的{}
以及 if(){}
都不構成做用域;const obj = {
name: 'objName',
say() {
console.log(this.name);
},
read: () => {
console.log(this.name);
}
}
obj.say(); // objName
obj.read(); // undefined
複製代碼
say()
是普通函數,前面有點,因此this
指向obj
;this.name
爲undefined
,say
,say()
的調用者是objconst obj = {
say: function () {
setTimeout(() => {
console.log(this)
});
}
}
obj.say(); // obj,此時this指的是定義他的obj
複製代碼
function test() {
console.log(this);
}
test(); //window
複製代碼
this爲{}
,普通函數中默認this爲global
console.log(this); // {}
function test() {
console.log(this);
}
test(); //global
複製代碼
var length = 10;
function fn() {
console.log(this.length);
}
const obj = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
}
};
obj.method(fn, 1);
複製代碼
輸出 10, 2java
剛開始看到這道題我也是濛濛的,如今也終於理解了, method這個函數傳入了兩個參數,一個參數爲fn()
,fn()
爲普通函數,this指向函數的調用者,此時指向全局(也能夠看這個函數前面沒有點
),因此運行結果爲10,arguments是函數的全部參數,是一個類數組的對象,arguments[0] (),能夠當作是arguments.0(),調用這個函數的是arguments
,此時this就是指arguments
,this.length就是angument.length
,就是傳入的參數的總個數2node
注:git
var length = 10
改爲global.length = 10;
是由於node環境下定義在全局的變量不會綁定到global,瀏覽器也會自動綁定到全局環境window改爲下面這樣結果又是什麼呢?github
var length = 10;
function fn() {
console.log(this.length);
}
const obj = {
length: 5,
method: function(fn) {
fn();
const fun = arguments[0];
fun();
}
};
obj.method(fn, 1);
複製代碼
10, 10數組
window.val = 1;
var obj = {
val: 2,
dbl: function() {
this.val *= 2;
val *= 2;
console.log(val);
console.log(this.val);
}
}
obj.dbl(); // 2 4
var func = obj.dbl;
func(); // 8 8
複製代碼
這個就是有點繞了,不過一步步來分析就很容易理解了:瀏覽器
obj.dbl()
;執行這行代碼時,this指的是obj
,因此this.val === obj.val*=2
,最後結果爲4
,val*=2 === window.val *= 2
,最後結果是2
函數
func()
,執行這行代碼時,func()
沒有任何前綴,this
指的是window.func()
;因此此時this值得是window
,this.val === window.val *= 2
,此時window.val
爲4
,val*=2 === window.val *2
,最後結果爲8
,最後console.log(this.val)
,與console.log(val)
,指的都是window.val
,最後結果都是8
上述是我本身的理解,若是有什麼問題,歡迎指正~ui