之前博主去蘇寧總部面試的分享漏了一個this指針的面試題,整理如下,問了兩個方面。
有興趣的猿友可以 點擊這裏 查看之前面試分享。
this指向有哪幾種情況:
全局作用域或者普通函數自執行中this指向全局對象window
事件函數內部的this指向事件源:注意在事件函數中如果包含普通函數,普通函數自執行後,內部this還是指向window
對象方法調用時,this指向調用的對象
1、全局作用域 / 普通函數中的this
this對象是在運行時基於函數的執行環境綁定的:在全局函數中,this指向的是window;當函數被作爲某個對象的方法調用時,this就等於那個對象。
//全局作用域
console.log(this); //Window
//普通函數
function fn(){
console.log(this); //Window
}
2、事件函數中的this指向事件源
3、對象方法調用時,this指向調用的對象
let obj = {
name : "lanlan",
fn : function(){
console.log(this);
},
lacy:{
name : "didi",
fn : function(){
let num = 10;
console.log(this);
}
}
};
obj.fn(); //obj
obj.dudu.fn(); //lacy
4、類實例來調用函數時,this指向實例
class B {
fn() {
console.log(this)
}
}
var b = new B()
var fun = b.fn
b.fn() // 指向 b
fun() // undefined
ES6 下的 class 內部默認採用的是嚴格模式,fun不會指定全局對象爲默認調用對象
5、 ES6箭頭函數的this
箭頭函數中的this始終指向箭頭函數定義時的離this最近的一個函數,如果沒有最近的函數就指向window
箭頭函數的this是在定義函數時綁定的,不是在執行過程中綁定的。簡單的說,函數在定義時,this就繼承了定義函數的對象。
補充:
箭頭函數和普通函數相比,有以下幾個區別,在開發中應特別注意:
不綁定 arguments 對象,也就是說在箭頭函數內訪問 arguments 對象會報錯;
不能用作構造器,也就是說不能通過關鍵字 new 來創建實例;
默認不會創建 prototype 原型屬性;
不能用作 Generator() 函數,不能使用 yeild 關鍵字。