Javascript學(xué)習(xí)筆記之 函數(shù)篇(二) : this 的工作機(jī)制
全局作用域下
this;
當(dāng)在全局作用域中使用 this,它指向全局對(duì)象。
這里詳細(xì)介紹下全局對(duì)象:
全局對(duì)象(Global object) 是在進(jìn)入任何執(zhí)行上下文之前就已經(jīng)創(chuàng)建了的對(duì)象;
這個(gè)對(duì)象只存在一份,它的屬性在程序中任何地方都可以訪問,全局對(duì)象的生命周期終止于程序退出那一刻。
全局對(duì)象初始創(chuàng)建階段將 Math、String、Date、parseInt 作為自身屬性,等屬性初始化,同樣也可以有額外創(chuàng)建的其它對(duì)象作為屬性(其可以指向到全局對(duì)象自身)。例如,在 DOM 中,全局對(duì)象的 window 屬性就可以引用全局對(duì)象自身。
所以在 console 內(nèi)輸入 window 和 this.window 是一樣的。
調(diào)用一個(gè)函數(shù)時(shí)
foo();
在這里,this 同樣指向全局對(duì)象。
調(diào)用一個(gè)方法時(shí)
test.foo();
在這個(gè)例子中,this 將會(huì)指向 test 對(duì)象。
調(diào)用一個(gè)構(gòu)造函數(shù)時(shí)
new foo();
一個(gè)函數(shù)在被調(diào)用時(shí)和關(guān)鍵字 new 一起使用,我們稱之為構(gòu)造函數(shù)。此時(shí)在函數(shù)內(nèi),this 指向新建的對(duì)象。
顯式設(shè)置時(shí)
function foo(a, b, c) {}// var bar = {}; foo.apply(bar, [1, 2, 3]); // array will expand to the below foo.call(bar, 1, 2, 3); // results in a = 1, b = 2, c = 3
當(dāng)使用 Function.prototype 的 apply 和 call 方法時(shí),this 的值為顯式設(shè)置為該方法的第一個(gè)參數(shù)。
因此,不同于調(diào)用一個(gè)函數(shù)時(shí)的規(guī)則,上例中 this 指向了 bar。
這里介紹下 call 和 apply 方法:
call 方法:
語法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。
apply 方法:
語法:apply([thisObj[,argArray]])
定義:應(yīng)用某一對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象。
在這里我們要注意一點(diǎn),在對(duì)象的字面聲明時(shí),this 不能用來指向?qū)ο蟊旧?。如下?/p>
var obj = {me: this}
這里,this 不會(huì)指向 obj,this 的應(yīng)用只限于以上五種情形。
總結(jié)
盡管上述情形在大多時(shí)候是有意義的,但是第二種情形(即調(diào)用一個(gè)函數(shù)時(shí))的 this 實(shí)際上是很少有用途的,這被認(rèn)為是 Javascript 設(shè)計(jì)上的另一個(gè)錯(cuò)誤。
Foo.method = function() { function test() { // this is set to the global object } test(); }
根據(jù)我們上面所述,這里的 this 將會(huì)指向全局對(duì)象,而不是 Foo 函數(shù)。
為了在 test 中獲得指向 Foo 的途徑,我們需要在 method 內(nèi)部創(chuàng)建一個(gè)局部變量指向 Foo。
Foo.method = function() { var that = this; function test() { // Use that instead of this here } test(); }
that 只是普通的變量名,但是它經(jīng)常被用來指向外部的 this。
還有一個(gè)比較有意思的地方與函數(shù)別名相關(guān),即將一個(gè)方法賦值給一個(gè)變量時(shí)。
var test = someObject.methodTest; test();
上例中,test 將會(huì)被當(dāng)做一個(gè)普通函數(shù)看待,所以根據(jù)第二種情形(即調(diào)用一個(gè)函數(shù)時(shí)),其內(nèi)部的 this 將會(huì)指向全局變量,而不是 someObject。
盡管,this 晚綁定初看上去是個(gè)不好的決定,但實(shí)際上這是原型式繼承工作的基礎(chǔ)。
function Foo() {} Foo.prototype.method = function() {}; function Bar() {} Bar.prototype = Foo.prototype; new Bar().method();
此時(shí),當(dāng) method 被調(diào)用時(shí),它將指向 Bar 的實(shí)例對(duì)象。
- 淺談Javascript中的函數(shù)、this以及原型
- 深入理解js函數(shù)的作用域與this指向
- JS函數(shù)this的用法實(shí)例分析
- js對(duì)象內(nèi)部訪問this修飾的成員函數(shù)示例
- js this函數(shù)調(diào)用無需再次抓獲id,name或標(biāo)簽名
- js原生態(tài)函數(shù)中使用jQuery中的 $(this)無效的解決方法
- 改變javascript函數(shù)內(nèi)部this指針指向的三種方法
- JavaScript 嵌套函數(shù)指向this對(duì)象錯(cuò)誤的解決方法
- javascript讓setInteval里的函數(shù)參數(shù)中的this指向特定的對(duì)象
- Javascript this 函數(shù)深入詳解
相關(guān)文章
Javascript入門學(xué)習(xí)第一篇 js基礎(chǔ)
這是我看了DOM編程藝術(shù),悟透JavaScript,javascript權(quán)威指南5做的筆記,我資質(zhì)不深,不能寫出高深的文章, 如果你覺得筆記寫得不好,可以不看我以后的。這篇文章就當(dāng)作浪費(fèi)你幾分鐘。2008-07-07JS中for循序中延遲加載動(dòng)態(tài)效果的具體實(shí)現(xiàn)
今天在做一個(gè)前端的效果的時(shí)候碰到一個(gè)棘手的問題,就是實(shí)現(xiàn)一個(gè)動(dòng)態(tài)的圓柱效果,廢話不多少,直接上代碼2013-08-08探討JavaScript中的Rest參數(shù)和參數(shù)默認(rèn)值
這篇文章的主要介紹了JavaScript中的Rest參數(shù)和參數(shù)默認(rèn)值,內(nèi)容很充實(shí),需要了解的朋友可以參考下2015-07-07javascript input圖片上傳及預(yù)覽,FileReader預(yù)覽圖片
本文放置了html完成代碼案例,有需要大家可以直接復(fù)制測(cè)試功能,采用input文本框圖片上傳,使用FileReader預(yù)覽圖片效果2021-06-06