簡體   English   中英

如何檢索陰影全局變量的值?

[英]How to retrieve the value of a shadowed global variable?

例子:

var test = 'global value';

(function() {
    var test = 'local value';

    // how to get the 'global value' string
})();

假設宿主環境未知,這意味着我們不能假設可以通過window名稱訪問全局對象。 此外,該函數不允許接收任何參數!

修復

var test = 'global value';

(function() {
    var test2 = 'local value';

    console.log(test);
})();

真正的解決方案是修復您的代碼,這樣您就不會隱藏您關心的全局變量。

評估工作

您可以隨時使用全局 eval,它是最可靠的。

例子

var test = 'global value';

function runEval(str) {
  return eval(str);
}

(function() {
    var test = 'local value';

    console.log(runEval("test"));
})();

如果您不喜歡定義全局 eval,您可以使用Function間接完成

現場示例

var test = 'global value';

(function() {
    var test = 'local value';

    console.log(new Function ("return test;") () );
})();

其他黑客

以下在非嚴格模式下工作

(function () {
  var test = "shadowed";

  console.log(this !== undefined && this.test);
})();

這個 hack 可以在破碎的實現中工作

(function() {
    var test = 'local value';

    try { delete test; } catch (e) { }

    console.log(test);
})();

依靠它的this作為全局對象怎么樣(沒有顯式引用window )。

console.log(this.test);

js小提琴

您也可以使用對eval()的間接調用( execScript()用於 IE 目的,但可以隨意忽略,因為您提到不假設瀏覽器)。

console.log((window.execScript || eval)('test'));

js小提琴

從根本上說,如果您想在嚴格模式代碼中執行此操作,那么最大的問題是獲取全局對象。 幸好有一些簡單的方法: var global = (1,eval)("this"); (它不適用於所有瀏覽器,因為它的行為在 ES3 中未定義,盡管在 ES5 中定義)或var global = (new Function("return this"))(); (確實如此)。

所以,把它和你需要的其他東西放在一起,你可以有一個功能,比如:

function getGlobal(name) {
  "use strict";
  var global = (new Function("return this"))();
  return global[name];
}

避免每次創建函數的成本可能會更好,因此類似以下內容會更好:

var getGlobal = (function() {
  "use strict";
  var global = (new Function("return this"))();
  return function(name) {
    return global[name];
  }
})();

ES2020以來,所有現代瀏覽器都支持globalThis。

var test = 'global value';

(function() {
    var test = 'local value';

    console.log(globalThis.test); // 'global value'
})();

這取決於。 繞過“不允許接收任何參數”的“厚臉皮”方法可能是使用call

var test = 'global value';

(function() {
    var test = 'local value';

    var globalTest = this.test;
}).call(this);

但是,如果你能指望this是當沒有全局對象this沒有明確指定,然后this.test會工作。

另一種解決方案是記憶全局對象:

var test = "global";
function called() {
    var test = "local";
    alert(arguments.callee.window.test); // alerts "global"
}
called.window = this;
called();

暫無
暫無

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

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