[英]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);
})();
從根本上說,如果您想在嚴格模式代碼中執行此操作,那么最大的問題是獲取全局對象。 幸好有一些簡單的方法: 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];
}
})();
這取決於。 繞過“不允許接收任何參數”的“厚臉皮”方法可能是使用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.