隨著前端技術的不斷發展,JavaScript(以下簡稱JS)已經成為了不可或缺的一部分。在JS中,this是一個非常重要的概念。對于剛接觸JS的人來說,可能會產生一些疑惑,比如this到底是什么?this有什么用?
簡單來說,this是一個指針,指向當前執行代碼的上下文對象。所謂上下文對象,可以理解為當前代碼所處的作用域。具體來說,this的指向由函數的調用方式決定。下面舉幾個例子來說明:
// 例一 var name = 'Lucy'; function showName() { console.log(this.name); } showName(); // undefined // 例二 var name = 'Lucy'; function showName() { console.log(this.name); } var obj = { name: 'Tom', showName: showName } obj.showName(); // Tom // 例三 var name = 'Lucy'; function showName() { console.log(this.name); } var obj = { name: 'Tom', showName: function() { console.log(this.name); } } obj.showName(); // Tom
從上面的例子可以看出,this的指向是根據函數調用的方式來決定的。如果是全局作用域下的函數調用,this指向的是全局對象;如果是作為一個對象的方法調用,this指向的是這個對象本身;如果是使用new關鍵字調用構造函數,this指向的是新創建的對象。
另外,有一種比較特殊的JS對象——箭頭函數,箭頭函數的this指向的是定義時所在的作用域,而不是調用時的作用域。
// 例四 var name = 'Lucy'; function showName() { console.log(this.name); } var obj = { name: 'Tom', showName: () => { console.log(this.name); } } obj.showName(); // Lucy
需要注意的是,this的指向可以被修改。比如使用apply、call和bind這三個方法,可以改變函數執行時的this上下文。下面來看一些例子:
// 例五 var name = 'Lucy'; function showName() { console.log(this.name); } var obj1 = { name: 'Tom' } var obj2 = { name: 'Jerry' } showName.apply(obj1); // Tom showName.call(obj2); // Jerry var newFunc = showName.bind(obj1); newFunc(); // Tom
除此之外,還有一種比較特殊的情況,this的值可能是undefined。比如在嚴格模式('use strict')下,全局作用域下的函數調用時,this的值是undefined。
// 例六 'use strict'; function showName() { console.log(this); } showName(); // undefined
總之,this是JS中非常重要的一個概念,理解this的指向原理,可以幫助我們更好地掌握JS的語法和編程思想。