我有以下函数,我使用它(诚然,作为 hack,因为我仍然没有理解 javascript 的奇怪变量范围规则),从脚本中获取所有具有已知前缀的全局变量。
该功能适用于 FF 和 Google Chrome(假设它适用于所有 Moz 衍生浏览器)。然而,我刚刚在 IE8(又名比尔盖茨叔叔 [如比尔盖茨] 浏览器)中对其进行了测试,并且(也许不足为奇)该功能不起作用。我调试了这个函数,看起来全局变量存储在另一个对象中(我可能是错的,我现在才阅读 JS 几天)。无论如何,这是在基于 Moz 的浏览器中正常工作的函数:
function getGlobalProperties(prefix) {
var keyValues = [], global = window; // window for browser environments
for (var prop in global) {
if (prop.indexOf(prefix) == 0) // check the prefix
keyValues.push(prop + "=" + global[prop]);
}
return keyValues.join('&'); // build the string
}
我是否需要条件分支(以及是否在 IE 下运行的测试)?
最佳答案
这是一个已知问题,IE 不会为窗口对象上的 for-in 循环公开全局变量(尽管事实上可以像 window.globalVar 一样直接访问全局变量)。 可能的解决方法是将全局变量显式声明为窗口对象的成员,例如:
window.globalVar = 1;
...
alert(globalVar); // = 1
globalVar = 'xxx';
alert(window.globalVar); // = xxx
通过在脚本开头以这种方式声明变量,您将使它们可用于 for-in 循环。
更好的解决方案当然是避免使用全局变量 :-) 或者至少将它们全部保存在单独的变量中,您以后可以在没有黑客的情况下进行遍历。
关于Javascript 函数适用于 FF 和 Chrome,但不适用于比尔叔叔的浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2263027/