谈谈我对Javascript中This对象的理解
this 指針的隱式賦值
this總是指向調用該方法的對象;
在事件中,this指向觸發這個事件的對象,特殊的是,IE中的attachEvent中的this總是指向全局對象Window;
?
顯示操縱 this 指針
Javascript引擎通過以下兩種方式允許我們顯式指定this指針指代的對象:
1. 通過new操作符,Javascript引擎會將this指針返回給被賦值的變量。
2. 通過Function.apply或者Function.call或者Function.bind的原型方法,我們可以將this指針指代的對象以參數的形式傳入,這個時候,函數內部使用的this指針就是傳入的參數。
?
閉包中的 this 對象
this對象是在運行的時候基于函數的執行環境綁定的:在全局函數中,this等于window,而當函數被作為某個對象的方法調用時,this等于那個對象。不過,匿名函數的執行環境具有全局性,因此其this對象通常指向window。但有時候由于編寫閉包的方式不同,這一點可能不會那么明顯。下面來看一個例子:
var name = "The Window";var obj = {name : "My Obj",getNameFunc : function(){return function(){return this.name;};} }alert(obj.getNameFunc()()); //"The Window" (在非嚴格模式下)以上代碼先創建了一個全局變量 name,又創建了一個包含 name 屬性的對象。這個對象還包含一個方法——getNameFunc(),它返回一個匿名函數,而匿名函數又返回 this.name。為什么這個匿名函數沒有取得其外部作用于的 this 對象呢?每個函數在被調用時,其活動對象都會自動取得兩個特殊變量: this 和 arguments。內部函數在搜索這兩個變量時,只會搜索到其活動對象為止,因此永遠不可能直接訪問外部函數中的這兩個變量。不過,把外部作用于中德 this 對象保存在一個閉包能夠訪問到的變量里,就可以讓閉包訪問該對象了,如下所示:
var name = "The Window";var obj = {name : "My Obj",getNameFunc : function(){var that = this;return function(){return that.name;};} }alert(obj.getNameFunc()()); //"My Object"?
在幾種特殊情況下, this 的值可能會意外地改變。比如,下面的代碼是修改前面例子的結果:
var name = "The Window";var obj = {name : "My Obj",getNameFunc : function(){return this.name;} } obj.getNameFunc(); //"My Object" (obj.getName)Func(); //"My Object" (obj.getNameFunc = obj.getNameFunc)(); //"The Window" ,在非嚴格模式下第三行代碼先執行了一條賦值語句,然后再調用賦值后的結果。因為這個賦值表達式的值是函數本身,所以 this 的值不能得到維持(沒有引用 obj,當前活動對象是 window),結果就返回了"The Window"。
?
轉載于:https://www.cnblogs.com/ppJuan/p/6696321.html
總結
以上是生活随笔為你收集整理的谈谈我对Javascript中This对象的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 去隔行计划分析
- 下一篇: Eclipse中SVN分支与合并