我有以下函数,我使用(作为一个hack,因为我还没有理解javascript的bizzare变量作用域规则),从脚本中获取具有已知前缀的所有全局变量。
该功能适用于FF和谷歌浏览器(预测它适用于所有Moz衍生浏览器)。但是,我刚刚在IE8(也就是比尔盖茨的比利时)中测试了它,并且(也许是不可思议的),该功能无法正常工作。我调试了函数,似乎全局变量存储在另一个对象中(我可能错了,我现在只读了几天JS)。在任何情况下,这是函数,它在'Moz bazed browsers:
中正常工作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下运行)?
答案 0 :(得分:2)
已知问题,IE不会为窗口对象上的for-in循环公开全局变量(尽管直接访问全局变量就像window.globalVar一样)。 可能的解决方法是将全局变量明确地声明为window对象的成员,如:
window.globalVar = 1;
...
alert(globalVar); // = 1
globalVar = 'xxx';
alert(window.globalVar); // = xxx
通过在脚本开头以这种方式声明变量,您可以使它们可以进行for-in循环。
更好的解决方案当然是避免全球变种:-) 或者至少将它们保存在单独的变量中,以后可以在没有黑客的情况下进行遍历。
答案 1 :(得分:0)
它看起来应该有效,是全局关键字吗?尝试直接使用其他东西或只使用windows变量。
答案 2 :(得分:0)
在IE中,请务必将您的属性存储在您希望它们阅读的位置。
答案 3 :(得分:0)
global
实际上不是 a JavaScript reserved word。
尝试使用此代替您拥有的内容(评论您的代码可能会在IE上遇到的潜在问题):
function getGlobalProperties(prefix) {
var keyValues = [], global = window; // window for browser environments
for (var prop in global) {
if (prop.indexOf(prefix) == 0) { // check the prefix
try {
// this implicitly converts a window property to a string, which might fail
keyValues.push(prop + "=" + global[prop]);
} catch (e) {
// in case string conversion blows up
// do something about it here
}
}
}
return keyValues.join('&'); // build the string
}