1

有谁知道如何在 IE8 中进行这项工作?

var html = (function () {/*   <!DOCTYPE html>   <html>
    <body>
      <h1>Hello, world!</h1>
    </body>   </html>        
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];

Chrome 返回这个(这是预期的答案)

 <!DOCTYPE html>
  <html>
    <body>
      <h1>Hello, world!</h1>
    </body>
  </html> 

但 IE8 不喜欢它,它返回

  '/' expected

我已经验证了 IE8 中的 toString() 部分,它包含

"(function () {/*   <!DOCTYPE html>   <html>
        <body>
          <h1>Hello, world!</h1>
        </body>   </html>        
    */})"

目标是提取注释中的内容,因此可以在 javascript 中使用多行字符串而无需添加任何字符。因此,如果有人想出另一个适用于 IE8 和 Chrome 的正则表达式,那就太好了。

4

1 回答 1

0

应用于函数的toString方法不一定返回与键入的源代码完全相同的源代码。MDN说“toString 对函数进行反编译,返回的字符串包括函数关键字、参数列表、花括号和函数体的来源”。它还表明这是非标准和过时的。ECMAscript 标准有以下说法:

15.3.4.2 函数.prototype.toString()

返回函数的依赖于实现的表示。此表示具有 FunctionDeclaration 的语法。请特别注意,在表示字符串中使用和放置空格、行终止符和分号是依赖于实现的。

toString 函数不是通用的;如果 this 值不是 Function 对象,它会抛出 TypeError 异常。因此,它不能转移到其他种类的对象中用作方法。

我不敢说所有的 JS 实现都支持 function.toString,但我知道没有一个不支持。然而,它们的实现方式各不相同。Chrome 似乎返回了包括评论在内的完整源代码,Firefox 删除了评论。

我和你有同样的想法使用评论来传递信息,但当我发现 Firefox 删除它们时放弃了它。

综上所述,由于 toString正在返回注释字符串,因此 RE 肯定存在问题。没有可用于测试的 IE8 我无法提出明确的修复建议,但您可以尝试以下方法:

 /\/\*([^]*?)\*\/\}$/

我在开始时删除了多余的 [^]* 并使捕获 [^]* 不贪婪。您的原始版本和我更改的版本都可以在我的 Chrome 浏览器中使用。

于 2013-08-23T12:02:17.847 回答