函数②
JavaScript 有一套完全不同于其它語言的對(duì)?this?的處理機(jī)制。 在五種不同的情況下 ,this?指向的各不相同。
全局范圍內(nèi)
this;當(dāng)在全部范圍內(nèi)使用?this,它將會(huì)指向全局對(duì)象。
譯者注:瀏覽器中運(yùn)行的 JavaScript 腳本,這個(gè)全局對(duì)象是?window。
函數(shù)調(diào)用
foo();這里?this?也會(huì)指向全局對(duì)象。
ES5 注意:?在嚴(yán)格模式下(strict mode),不存在全局變量。 這種情況下?this?將會(huì)是?undefined。
方法調(diào)用
test.foo();這個(gè)例子中,this?指向?test?對(duì)象。
調(diào)用構(gòu)造函數(shù)
new foo();如果函數(shù)傾向于和?new?關(guān)鍵詞一塊使用,則我們稱這個(gè)函數(shù)是?構(gòu)造函數(shù)。 在函數(shù)內(nèi)部,this?指向新創(chuàng)建的對(duì)象。
顯式的設(shè)置?this
function foo(a, b, c) {}var bar = {}; foo.apply(bar, [1, 2, 3]); // 數(shù)組將會(huì)被擴(kuò)展,如下所示 foo.call(bar, 1, 2, 3); // 傳遞到foo的參數(shù)是:a = 1, b = 2, c = 3當(dāng)使用?Function.prototype?上的?call?或者?apply?方法時(shí),函數(shù)內(nèi)的?this將會(huì)被?顯式設(shè)置為函數(shù)調(diào)用的第一個(gè)參數(shù)。
因此函數(shù)調(diào)用的規(guī)則在上例中已經(jīng)不適用了,在foo?函數(shù)內(nèi)?this?被設(shè)置成了bar。
注意:?在對(duì)象的字面聲明語法中,this?不能用來指向?qū)ο蟊旧怼?因此?var obj = {me: this}?中的?me?不會(huì)指向obj,因?yàn)?this?只可能出現(xiàn)在上述的五種情況中。?譯者注:這個(gè)例子中,如果是在瀏覽器中運(yùn)行,obj.me?等于window?對(duì)象。
常見誤解
盡管大部分的情況都說的過去,不過第一個(gè)規(guī)則(譯者注:這里指的應(yīng)該是第二個(gè)規(guī)則,也就是直接調(diào)用函數(shù)時(shí),this?指向全局對(duì)象) 被認(rèn)為是JavaScript語言另一個(gè)錯(cuò)誤設(shè)計(jì)的地方,因?yàn)樗?strong>從來就沒有實(shí)際的用途。
Foo.method = function() {function test() {// this 將會(huì)被設(shè)置為全局對(duì)象(譯者注:瀏覽器環(huán)境中也就是 window 對(duì)象)}test(); }一個(gè)常見的誤解是?test?中的?this?將會(huì)指向?Foo?對(duì)象,實(shí)際上不是這樣子的。
為了在?test?中獲取對(duì)?Foo?對(duì)象的引用,我們需要在?method?函數(shù)內(nèi)部創(chuàng)建一個(gè)局部變量指向?Foo?對(duì)象。
Foo.method = function() {var that = this;function test() {// 使用 that 來指向 Foo 對(duì)象}test(); }that?只是我們隨意起的名字,不過這個(gè)名字被廣泛的用來指向外部的?this對(duì)象。 在?閉包?一節(jié),我們可以看到?that?可以作為參數(shù)傳遞。
方法的賦值表達(dá)式
另一個(gè)看起來奇怪的地方是函數(shù)別名,也就是將一個(gè)方法賦值給一個(gè)變量。
var test = someObject.methodTest; test();上例中,test?就像一個(gè)普通的函數(shù)被調(diào)用;因此,函數(shù)內(nèi)的?this?將不再被指向到?someObject?對(duì)象。
雖然?this?的晚綁定特性似乎并不友好,但這確實(shí)是基于原型繼承賴以生存的土壤。
function Foo() {} Foo.prototype.method = function() {};function Bar() {} Bar.prototype = Foo.prototype;new Bar().method();當(dāng)?method?被調(diào)用時(shí),this?將會(huì)指向?Bar?的實(shí)例對(duì)象。
轉(zhuǎn)載于:https://www.cnblogs.com/luckyxb/p/6398512.html
總結(jié)
- 上一篇: 圆环自带动画进度条ColorfulRin
- 下一篇: flask 继承模版的基本使用