2014-01-22 24 views
0

我有,我想在它的子方法返回我的全局對象的實例(想流暢的界面)的一些JS代碼:this.variable VS可變子作用域

myGlobalVar = function() { 
    this.self = this; 
    this.Whatever = function() { 
     //return self; // why does that FAIL?? 
     return this.self; // why does that WORK?? 
    } 
} 

我本來認爲我最好return self但是失敗了。 return this.self成功,但我想this在子功能將參考上述功能。爲什麼這個工作?

+0

沒有自由浮動變量「self」返回...這個意思在子函數中沒有變化,如圖所示。 – dandavis

+0

這是爲什麼,@ dandavis? – Haney

+0

你沒有var關鍵字或參數,所以沒有命名變量。 – dandavis

回答

2

在javascript中,函數中的this的值由函數的調用者決定。

當您撥打obj.method()時,this的值設置爲obj,內部爲method()。因此,在您上面的示例中,當您撥打myGlobalVar.Whatever()時,Whatever()中的this的值將爲myGlobalVar,以便參考sefl,您使用this.self,因爲您已經發現該值。

self所有這一切本身並不起作用,因爲它本身並不是當前範圍內的變量。這是myGlobalVar的財產,因此只能在this === myGlobalVar時引用爲myGlobalVar.selfthis.self。爲了解析符號,Javascript不會自動檢查當前對象的屬性。您只能通過特別引用承載該屬性的對象來訪問對象的屬性,如this.self


this的值還有其他方法可以改變。如果Whatever()是沒有obj上下文調用,如:

var fn = myGlobalVar.Whatever; 
fn(); 

然後,這個值將是無論是在常規JS的全局對象或undefined在JS嚴格模式。


也有每個功能,讓您直接指定你想要的this值被設置爲在方法內部爲myGlobalVar.Whatever.call(myOtherGlobalVar)什麼.call().apply()方法。

+0

現在*這個*答案對我有意義。謝謝! – Haney

1

當您嘗試訪問變量JavaScript時,首先在當前函數作用域中查找該變量,然後在封閉的函數作用域中查找該變量,最後在全局作用域中查找該變量。在你的情況下,self是全局對象this的成員。當你說this.self,並且如果this涉及全球範圍,this.self是相同的self。除非您更改當前上下文,否則this將引用全局對象,它應該起作用。檢查以下示例以更好地理解。

myGlobalVar = function() { 
    this.self = "thefourtheye"; 
    this.Whatever = function() { 
     console.log(self); 
     console.log(this.self); 
     console.log(this.self === self); 
    } 
} 

var b = { 
    self: "thethirdeye" 
} 

myGlobalVar(); 
Whatever(); 
console.log("-------------------"); 
Whatever.apply(b); 

輸出

thefourtheye 
thefourtheye 
true 
------------------- 
thefourtheye 
thethirdeye 
false 

當我打電話Whatever,第二次,我設置了當前上下文反對b,與適用。所以,現在this指向b。現在,selfthis.self不同。當我參考self時,它查找層次結構並在全局範圍內找到self,它打印thefourtheye,當我說this.self時,它在b中查找self並打印thethirdeye。現在希望它清楚。

+0

如果'this'在Whatever()中不可用,this如何正確返回OP? – dandavis

+0

@dandavis我們沒有返回'this.self',我們正在返回'self' :) – thefourtheye

+1

我的意思是說你說:「這裏的問題是這個,你在這個本身中引用了這個,所以它會不在任何內部可用「,當顯然OP確實可以看到這一點,它的屬性是」自我「。 – dandavis