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