JScript / WindowsScriptHost是否缺少Array.forEach()?

时间:2016-04-08 10:40:08

标签: jscript

我编写JSCript并使用WindowsScriptHost运行它。但是,似乎缺少Array.forEach()。

['a', 'b'].forEach(function(e) {
    WSH.Echo(e);
});

失败" test.js(66,2)Microsoft JScript运行时错误:对象不支持此属性或方法"。

这不对吗?它真的缺少Array.forEach()吗?我真的必须使用其中一个for-loop-variants?

1 个答案:

答案 0 :(得分:3)

JScript使用JavaScript功能集as it existed in IE8。即使在Windows 10中,Windows脚本宿主也仅限于JScript 5.7。这个MSDN documentation解释了:

  

从JScript 5.8开始,默认情况下,JScript脚本引擎支持5.7版本中存在的语言功能集。这是为了保持与早期版本引擎的兼容性。要使用版本5.8的完整语言功能集,Windows脚本界面主机必须调用IActiveScriptProperty::SetProperty

...最终意味着,由于cscript.exewscript.exe没有允许您调用该方法的开关,Microsoft建议您编写自己的脚本主机来解锁Chakra引擎。

但是有一种解决方法。您可以调用htmlfile COM对象,强制它与IE9(或10或11或Edge)兼容,然后导入您希望的任何方法 - 包括Array.forEach(),JSON方法等。这是一个简短的例子:

var htmlfile = WSH.CreateObject('htmlfile');
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');

// And now you can use htmlfile.parentWindow to expose methods not
// natively supported by JScript 5.7.

Array.prototype.forEach = htmlfile.parentWindow.Array.prototype.forEach;
Object.keys = htmlfile.parentWindow.Object.keys;

htmlfile.close(); // no longer needed

// test object
var obj = {
    "line1" : "The quick brown fox",
    "line2" : "jumps over the lazy dog."
}

// test methods exposed from htmlfile
Object.keys(obj).forEach(function(key) {
    WSH.Echo(obj[key]);
});

输出:

  

快速棕狐   跳过懒狗。

还有一些其他方法demonstrated in this answer - JSON.parse()String.trim()Array.indexOf()