JavaScript中的this關鍵詞指向
1、es5中的this的指向
this
是JavaScript
的一個關鍵字,他是函數執行過程中,自動生成的一個內部對象,指當前的對象,隻在當前函數內部使用。- 在
es5
中this
的指向取決於函數運行時的環境。 - 沒有直接掛載者(或稱調用者)的函數中
this
,非嚴格模式下指向window
,在use strict
嚴格模式下,默認為undefined。以下都是在非嚴格模式下討論
var name = 'hello window!'; var obj = { name: 'hello obj!', fn: function() { console.log(this.name); } }; var fn = obj.fn; fn(); // hello window! obj.fn(); // hello obj!
obj.fn()
在執行時,fn
中的this
指向的是當前的調用對象obj
。fn()
執行時,this
指向的是window
對象。
var fn = obj.fn; // 等價於 window.fn = obj.fn; fn(); // 等價於 window.fn();
匿名函數的執行環境是全局的
var name = 'hello window!'; var obj = { name: 'hello obj!', fn: function() { console.log(this.name); // 'hello obj!' return function() { console.log(this.name); // 'hello window!' }; } }; obj.fn()();
2、es6中的this
es6
箭頭函數的特點
- 箭頭函數沒有自己的
this
- 函數體內的
this
對象,就是定義時所在的對象,而不是使用時所在的對象,即外層代碼的this
引用。 - 不可以當作構造函數,也就是說,不可以使用
new
命令,否則會拋出一個錯誤。 - 沒有
arguments
對象。如果要用,可以用Rest
參數代替。 - 不可以使用
yield
命令,因此箭頭函數不能用作Generator
函數
示例說明,修改上述示例代碼中的函數為箭頭函數:
// 示例代碼1 var name = 'hello window!'; var obj = { name: 'hello obj!', fn: () => { console.log(this.name); // 這裡的this指向的外層的this,即window對象,想當於上打印的是console.log(window.name); } }; var fn = obj.fn; fn(); // hello window! obj.fn(); // hello window! // 示例代碼2 var name = 'hello window!'; var obj = { name: 'hello obj!', fn: function() { console.log(this.name); // hello obj! return () => { console.log(this.name); // hello obj! // this指向外層的this,即obj對象 }; } }; obj.fn()();
總結:
es5
中的this
主要看運行的環境,指向的是調用它的對象。- 箭頭函數中的
this
是在一開始就固定的,並不受調用對象
到此這篇關於JavaScript中的this關鍵詞指向的文章就介紹到這瞭,更多相關js的this指向內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- JavaScript中箭頭函數與普通函數的區別詳解
- 關於ES6中的箭頭函數超詳細梳理
- JavaScript嚴格模式use strict的介紹
- JavaScript Generator異步過度的實現詳解
- 詳解javascript中的Strict模式