使用特征检测通过点表示法检查对保留字的支持

Using feature detection to check support for reserved words via dot notation

本文关键字:检查 保留字 支持 表示 特征检测      更新时间:2023-10-19

我正在开发一个仍然需要支持IE8的网站,我们正在尝试包含Twitter共享按钮小部件。

在IE8中,我们看到"预期标识符"错误。这似乎是一个常见的问题,下面的帖子充分而好地解释了这一点:

  • Twitter小部件.js抛出JavaScript错误";期望的标识符";在IE8上
  • Twitter按钮导致IE8中出现JS错误(需要标识符)

基本上,Twitter已经停止支持IE8(我希望我也能这样做;)),但更重要的是,这个错误是由于Twitter小部件.js文件似乎通过点符号引用了一个名为delete的属性(这就是我在上面引用的第一篇SO帖子所暗示的)

基于上面的2篇SO帖子,有2种解决方法——要么复制一份widgets.js,然后将属性名称从delete更改为其他名称;或者使用条件注释来防止它被加载到IE8 中

我不喜欢复制(并且必须永远维护它!)widgets.js文件的想法,所以我正在考虑防止它被加载到IE8中。但我不想使用条件注释;我想使用特征检测。

因此,我试图编写以下内容,可以用来决定是否调用Twitter异步库加载代码:

NTJSLibrary.prototype.hostSupportsDeleteKeywordAsPropertyName = function hostSupportsDeleteKeywordAsPropertyName() {
    var testObj = {"delete":true};
    try {
        return testObj.delete;
    }
    catch (e) {
        // Host does not support referencing a property named 'delete' and has thrown an exception
        return false;
    }
};

不幸的是,它不起作用,因为IE8抛出了一个SCRIPT1010错误,这是一个编译/解释错误,而不是运行时错误。IE不会抛出异常,因为它没有运行!

有人知道我如何编写特征检测函数来检测通过点符号引用保留字delete是否会导致编译/解释错误吗?

不能用try-catch语句测试它的原因是语法错误在JavaScript中是"早期错误",这意味着错误会立即抛出,甚至不需要尝试执行代码。(请参见Javascript中的try-catch语句会捕获哪些类型的错误?以获得更详细的解释。)

为了解决这个问题,我们必须使用某种方式来动态创建代码,这将避免这个问题。在JavaScript中,您可以使用new Functioneval(在这种情况下,使用eval是可以接受的,因为我们不是在执行用户定义的代码,并且没有真正的方法来使用它)。

测试的一个例子可能是这样的:

function testReservedWords() {
  try {
    new Function('a.delete');
    return true;
  } catch (e) {
    return false;
  }
}