1.指向window物件
(1)全域性環境
全域性環境下this就是window物件的引用
注意:使用嚴格模式時在全域性函式內this為undefined
console.log(this == window);
//true
(2)物件裡的普通方法
show屬於obj物件的方法,因此裡面的this指向obj物件;
而hd是普通方法,裡面的this指向window物件,只要window物件沒有site屬性,就無法訪問到該屬性
let obj =
hd();
}};obj.show();
//demo
//undefined
2.指向例項物件
一般建構函式中包含屬性和方法,函式中的上下文指向到例項物件,屬性和方法裡面的this預設就是指當前物件。
function user() ;
}let hd = new user();
console.log(hd.say());
//user1
3.箭頭函式
在全域性環境中依然指向window物件
在物件的方法中,箭頭函式和父級函式指向同乙個this,會繼承定義函式時的上下文,因此如果想使用函式定義時的上下文中的this,那就使用箭頭函式
var name = "zhangsan";
let def = ()=>
def();
let obj =
}}console.log(obj.getname()());
//zhangsan
//lisi
4.事件函式
使用普通事件函式時this指向當前dom物件
button
let dom =
//相當於定義button物件的click方法,因此函式裡面的this指向botton物件
為當前dom元素物件
button.addeventlistener("click", function() );}};
dom.bind();
//undefinedbutton
使用箭頭函式時this指向上下文物件,和父級函式指向同乙個this
let dom = );}};
dom.bind();
//demobutton
5.特殊情況
this在閉包中的歷史遺留問題
this 總是指向呼叫該函式的物件,下面的函式因為是在全域性環境下呼叫的,所以this指向window,但這不是我們想要的。
let hd = ;
}};console.log(hd.get()());
//undefined
這個問題可以通過使用箭頭函式解決
let hd =
};console.log(hd.get()());
//demo
call 需要分別傳參
function show(title)
let lisi = ;
let zhangsan = ;
show.call(lisi, 'good');
console.log(lisi);
console.log(zhangsan);
////
bind()方法會建立並返回乙個新函式,稱為繫結函式,當呼叫這個繫結函式時,繫結函式會以建立它時傳入 bind()方法的第乙個引數作為 this,傳入 bind() 方法的第二個以及以後的引數加上繫結函式執行時本身的引數按照順序作為原函式的引數來呼叫原函式。
let bar = function(y) ;
let foo=;
let nbar = bar.bind(foo);
nbar(10);
console.log(foo);
//
例,用math.max得到陣列中最大的一項:
let array = [1, 2, 3];
//由於不需要改變this的指向,所以第乙個引數為null,也可以寫this,相當於用全域性物件去呼叫
console.log(max);
//3
this的指向問題
對於js基礎不是很好的我,一直不太懂this的指向問題。要搞懂這個還是得多動手。首先,我們知道 1.函式被呼叫時可以確定該函式內this的指向。因為函式中的this和arguments時兩個特殊的變數,在函式被呼叫時才會取得他們,而搜尋著兩個變數時只會在活動變數中找。2.確定函式被呼叫的位置,從而確...
this的指向問題
function foo var a 1 foo const obj obj.foo const c new foo function a console.log a 箭頭函式是沒有this的,箭頭函式中的this只取決包裹箭頭函式的第乙個普通函式的this。在這個例子中,因為包裹箭頭函式的第乙個普...
this的指向問題
宣告 本文 追夢子 大大的文章 徹底理解js中this的指向,不必硬背。偶遇此文自我總結一下,受益良多 例1 function a a 注意函式是在什麼作用域中呼叫的 這個函式實在全域性作用域中呼叫所以this指向的是window 全域性中沒有user所以是undefineds 例2 var o o...