簡體   English   中英

我可以顯式引用被同名本地陰影的JavaScript全局變量嗎?

[英]Can I explicitly reference a JavaScript global variable that's been shadowed by a local with the same name?

我已經看到很多關於JavaScript中全局和功能范圍之間差異的帖子,這里有很多鏈接。 我也看到了關於Python的確切問題。 所以我想知道的是,當“更接近”的范圍也有一個具有相同名稱的變量時,如何訪問全局變量?

var a = "global";
function b(){
  var a = "local";
  var magic = ...; // somehow put "global" in magic
  console.log(magic); // should print "global"
}

僅在瀏覽器中 ,我發現您可以使用window.a來指定全局。 服務器端有什么用嗎?

如果它真的是全局的(即不只是在外部范圍內),你可以這樣做:

var magic = (function(name){return this[name]}).call(null, "a");

從ECMAScript的文檔(10.4.3)

輸入功能代碼

當控件進入函數對象F中包含的函數代碼的執行上下文,調用者提供thisArg和調用者提供的argumentsList時,執行以下步驟:

如果函數代碼是嚴格代碼,請將ThisBinding設置為thisArg。 否則,如果thisArg為null或未定義,則將ThisBinding設置為全局對象。

請注意,您無法在jsFiddle中對此進行測試,因為全局范圍不是您定義a的位置。

示范

 var a = "global"; function b(){ var a = "local"; var magic = (function(name){return this[name]}).call(null, "a"); document.body.textContent = 'a: '+JSON.stringify(magic); // print "global" } b(); 

沒有標准可以做到這一點。 出於我自己的目的,我總是將我的變量放在容器中,其名稱類似於項目名稱:

var PROJECT = {}; //將“project”的所有“全局變量”放入此容器中

這樣,我可以在一個地方收集所有變量,如果我需要傳遞“全局”,我必須通過最多一個引用。

使用您的代碼作為答案的基礎,您可以使用以下內容實際拉出“ a ”的全局版本而不是本地版本:

var a = "global";
function b(){
  var a = "local";
  var magic = this.a; // somehow put "global" in magic
  console.log(magic); // should print "global"
}
b();

只有在上面的表單中調用b()函數時,這才有效。 這不起作用的一個例子如下:

var a = "global";
function b(){
  var a = "local";
  var magic = this.a; // somehow put "global" in magic
  console.log(magic); // should print "global"
}
b.call({a : "other context"});

在上面的情況中, "other context"將打印到控制台。

好吧,我沒有直接的答案,但解決方法是使用一個完善的容器,例如窗口

window['a'] = "global";

這不是一個非常干凈的解決方案,但它可以完成這項工作

您可以通過全局對象訪問全局。 在這種情況下窗口和當前上下文中的本地名稱。

這是一個小提琴的例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM