您好,登錄后才能下訂單哦!
這篇文章主要介紹“javascript中什么是this”,在日常操作中,相信很多人在javascript中什么是this問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”javascript中什么是this”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在js中,this的意思為“這個;當前”,是一個指針型變量,它動態指向當前函數的運行環境。在不同的場景中調用同一個函數,this的指向也可能會發生變化,但是它永遠指向其所在函數的真實調用者;如果沒有調用者,就指向全局對象window。
本教程操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。
JavaScript 函數被調用后會在一個特定的運行環境內執行,這個運行環境就是函數的調用者,或者說是調用函數的對象。如果函數沒有調用者(不是通過對象調用,而是直接調用),那么運行環境就是全局對象 window。
為了在函數執行過程中能夠引用(訪問)運行環境,JavaScript 專門增加了一個 this 關鍵字。this 是一個指針型變量,它指向當前函數的運行環境。
在不同的場景中調用同一個函數,this 的指向也可能會發生變化,但是它永遠指向其所在函數的真實調用者(誰調用就指向誰);如果沒有調用者,this 就指向全局對象 window。
在《JS this和調用對象》一節中我們曾講到 this 指針的初步使用,不了解的讀者請猛擊鏈接學習,本節重點對 this 指針進行深度剖析。
使用 this
this 是由 JavaScript 引擎在執行函數時自動生成的,存在于函數內的一個動態指針,指代當前調用對象。具體用法如下:
this[.屬性]
如果 this 未包含屬性,則傳遞的是當前對象。
this 用法靈活,其包含的值也是變化多端。例如,下面示例使用 call() 方法不斷改變函數內 this 指代對象。
var x = "window"; //定義全局變量x,初始化字符串為“window” function a () { //定義構造函數a this.x = "a"; //定義私有屬性x,初始化字符a } function b () { //定義構造函數b this.x = "b"; //定義私有屬性x,初始化為字符b } function c () { //定義普通函數,提示變量x的值 console.log(x); } function f () { //定義普通函數,提示this包含的x的值 console.log(this.x); } f(); //返回字符串“window”,this指向window對象 f.call(window); //返回字符串“window”,指向window對象 f.call(new a()); //返回字符a,this指向函數a的實例 f.call(new b()); //返回字符b,this指向函數b的實例 f.call(c); //返回undefined,this指向函數c對象
下面簡單總結 this 在 5 種常用場景中的表現以及應對策略。
1. 普通調用
下面示例演示了函數引用和函數調用對 this 的影響。
var obj = { //父對象 name : "父對象obj", func : function () { return this; } } obj.sub_obj = { //子對象 name : "子對象sub_obj", func : obj.func } var who = obj.sub_obj.func(); console.log(who.name); //返回“子對象sub_obj”,說明this代表sub_obj
如果把子對象 sub_obj 的 func 改為函數調用。
obj.sub_obj = { name : "子對象sub_obj", func : obj.func() //調用父對象obj的方法func }
則函數中的 this 所代表的是定義函數時所在的父對象 obj。
var who = obj.sub_obj.func; console.log(who.name); //返回“父對象obj”,說明this代表父對象obj
2. 實例化
使用 new 命令調用函數時,this 總是指代實例對象。
var obj = {}; obj.func = function () { if (this == obj) console.log("this = obj"); else if (this == window) console.log("this = window"); else if (this.contructor == arguments.callee) console.log("this = 實例對象"); } new obj.func; //實例化
3. 動態調用
使用 call 和 apply 可以強制改變 this,使其指向參數對象。
function func () { //如果this的構造函數等于當前函數,則表示this為實例對象 if (this.contructor == arguments.callee) console.log("this = 實例對象"); //如果this等于window,則表示this為window對象 else if (this == window) console.log("this = window對象"); //如果this為其他對象,則表示this為其他對象 else console.log("this == 其他對象 \n this.constructor =" + this.constructor); } func(); //this指向window對象 new func(); //this指向實例對象 cunc.call(1); //this指向數值對象
在上面示例中,直接調用 func() 時,this 代表 window 對象。當使用 new 命令調用函數時,將創建一個新的實例對象,this 就指向這個新創建的實例對象。
使用 call() 方法執行函數 func() 時,由于 call() 方法的參數值為數字 1,則 JavaScript 引擎會把數字 1 強制封裝為數值對象,此時 this 就會指向這個數值對象。
4. 事件處理
在事件處理函數匯總,this 總是指向觸發該事件的對象。
<input type="button" value="測試按鈕" /> <script> var button = document.getElementsByTagName("put")[0]; var obj = {}; obj.func = function () { if (this == obj) console.log("this = obj"); if (this == window) console.log("this = window"); if (this == button) console.log("this = button"); } button.onclick = obj.func; </script>
在上面代碼中,func() 所包含的 this 不再指向對象 obj,而是指向按鈕 button,因為 func() 是被傳遞給按鈕的事件處理函數之后才被調用執行的。
如果使用 DOM2 級標準注冊事件處理函數,程序如下:
if (window.attachEvent) { //兼容IE模型 button.attachEvent("onclick", obj.func); } else { //兼容DOM標準模型 button.addEventListener("click", obj.func, true); }
在 IE 瀏覽器中,this 指向 window 對象和 button 對象,而在 DOM 標準的瀏覽器中僅指向 button 對象。因為,在 IE 瀏覽器中,attachEvent() 是 window 對象的方法,調用該方法時,this 會指向 window 對象。
為了解決瀏覽器兼容性問題,可以調用 call() 或 apply() 方法強制在對象 obj 身上執行方法 func(),避免出現不同的瀏覽器對 this 解析不同的問題。
if (window.attachEvent) { button.attachEvent("onclick", function () { //用閉包封裝call()方法強制執行func() obj.func.call(obj); }); } else { button.attachEventListener("onclick", function () { obj.func.call(obj); }, true); }
當再次執行時,func() 中包含的 this 始終指向對象 obj。
5. 定時器
使用定時器調用函數。
var obj = {}; obj.func = function () { if (this == obj) console.log("this = obj"); else if (this == window) console.log("this = window對象"); else if (this.constructor == arguments.callee) console.log("this = 實例對象"); else console.log("this == 其他對象 \n this.constructor =" + this.constructor); } setTimeOut(obj.func, 100);
在 IE 中 this 指向 window 對象和 button 對象,具體原因與上面講解的 attachEvent() 方法相同。在符合 DOM 標準的瀏覽器中,this 指向 window 對象,而不是 button 對象。
因為方法 setTimeOut() 是在全局作用域中被執行的,所以 this 指向 window 對象。要解決瀏覽器兼容性問題,可以使用 call 或 apply 方法來實現。
setTimeOut (function () { obj.func.call(obj); }, 100);
到此,關于“javascript中什么是this”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。