前言前端
js中this指向問題是個老生常談的問題了,下面這篇文章再來給你們介紹下,你們能夠看看,更深刻的瞭解瞭解,下面話很少說了,來一塊兒看看詳細的介紹吧app
this this:上下文,會根據執行環境變化而發生指向的改變.函數
1.單獨的this,指向的是window這個對象學習
alert(this); // this -> window
2.全局函數中的thisthis
function demo() { alert(this); // this -> window } demo();
在嚴格模式下,this是undefined.code
function demo() { 'use strict'; alert(this); // undefined } demo();
3.函數調用的時候,前面加上new關鍵字視頻
所謂構造函數,就是經過這個函數生成一個新對象,這時,this就指向這個對象。對象
function demo() { //alert(this); // this -> object this.testStr = 'this is a test'; } let a = new demo(); alert(a.testStr); // 'this is a test'
前端全棧學習交流圈:866109386,面向1-3經驗年前端開發人員,幫助突破技術瓶頸,提高思惟能力,羣內有大量PDF可供自取,更有乾貨實戰項目視頻進羣免費領取。事件
4.用call與apply的方式調用函數開發
function demo() { alert(this); } demo.call('abc'); // abc demo.call(null); // this -> window demo.call(undefined); // this -> window
5.定時器中的this,指向的是window
setTimeout(function() { alert(this); // this -> window ,嚴格模式 也是指向window },500)
6.元素綁定事件,事件觸發後,執行的函數中的this,指向的是當前元素
window.onload = function() { let $btn = document.getElementById('btn'); $btn.onclick = function(){ alert(this); // this -> 當前觸發 } }
前端全棧學習交流圈:866109386,面向1-3經驗年前端開發人員,幫助突破技術瓶頸,提高思惟能力,羣內有大量PDF可供自取,更有乾貨實戰項目視頻進羣免費領取。
7.函數調用時若是綁定了bind,那麼函數中的this指向了bind中綁定的元素
window.onload = function() { let $btn = document.getElementById('btn'); $btn.addEventListener('click',function() { alert(this); // window }.bind(window)) }
8.對象中的方法,該方法被哪一個對象調用了,那麼方法中的this就指向該對象
let name = 'finget' let obj = { name: 'FinGet', getName: function() { alert(this.name); } } obj.getName(); // FinGet ---------------------------分割線---------------------------- let fn = obj.getName; fn(); //finget this -> window
騰訊筆試題
var x = 20; var a = { x: 15, fn: function() { var x = 30; return function() { return this.x } } } console.log(a.fn()); console.log((a.fn())()); console.log(a.fn()()); console.log(a.fn()() == (a.fn())()); console.log(a.fn().call(this)); console.log(a.fn().call(a));
前端全棧學習交流圈:866109386,面向1-3經驗年前端開發人員,幫助突破技術瓶頸,提高思惟能力,羣內有大量PDF可供自取,更有乾貨實戰項目視頻進羣免費領取。
答案
1.console.log(a.fn()); 對象調用方法,返回了一個方法。
function() {return this.x}
2.console.log((a.fn())()); a.fn()返回的是一個函數,()()這是自執行表達式。this -> window
20
3.console.log(a.fn()()); a.fn()至關於在全局定義了一個函數,而後再本身調用執行。this -> window
20
4.console.log(a.fn()() == (a.fn())());
true
5.console.log(a.fn().call(this)); 這段代碼在全局環境中執行,this -> window
20
6.console.log(a.fn().call(a)); this -> a
15