You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何检测浏览器是否支持JavaScript的Template Literals?

解决模板字符串特性检测的问题

你遇到的核心问题是:旧浏览器(比如Mobile Safari 7)在解析阶段就不认识模板字符串的语法,你的try { foo }代码还没到运行时执行的环节,浏览器就已经抛出语法错误了,所以catch根本没法捕获这个错误。

正确的特性检测方法

要避开这个问题,我们可以用动态创建函数的方式来检测,因为函数体的字符串是在运行时才被解析的,不会触发脚本加载阶段的语法错误:

function supportsTemplateLiterals() {
  try {
    // 用new Function来解析包含模板字符串的代码
    new Function('`foo`');
    return true;
  } catch (e) {
    // 解析失败说明不支持
    return false;
  }
}

原理说明

new Function()会把传入的字符串当作函数体进行语法解析,这个过程发生在代码运行时,而不是脚本加载的解析阶段。如果浏览器不支持模板字符串,解析这个函数体时会抛出错误,这时候try-catch就能正常捕获并返回false;如果支持,函数创建成功,返回true。

实际应用示例

你可以用这个检测结果来加载不同的脚本:

if (!supportsTemplateLiterals()) {
  // 加载Babel编译后的兼容脚本
  const script = document.createElement('script');
  script.src = '/path/to/your-compiled-script.js';
  document.head.appendChild(script);
} else {
  // 加载原生ES6脚本
  const script = document.createElement('script');
  script.src = '/path/to/your-es6-script.js';
  document.head.appendChild(script);
}

为什么原来的方法失效?

Mobile Safari 7这类旧浏览器对ES6语法完全没有兼容,当它读取到 foo 这种它不认识的语法符号时,会直接在脚本解析阶段抛出"无效字符"错误,整个脚本的执行会直接终止,你的try-catch代码根本没有机会被执行。

内容的提问来源于stack exchange,提问作者Andrew Newby

火山引擎 最新活动