【问题标题】:How to check if 'let' is supported by the browser?如何检查浏览器是否支持'let'?
【发布时间】:2019-09-23 13:49:11
【问题描述】:

检查我的浏览器是否支持 let 命令声明仅对当前代码块有效的变量的最佳方法是什么?

这不是问题What browsers currently support JavaScript's 'let' keyword?的重复,因为该问题是指FF中的非标准语法扩展,并且eval/Function解决方案没有发布。

我需要执行此检查以将使用旧浏览器的用户重定向到建议他们更新浏览器的网站。

【问题讨论】:

标签: javascript html


【解决方案1】:

特征检测新语法或关键字的唯一方法是eval它(或者,将它传递给不太好Function constructor):

function detectLet(){
  try{
    return !!new Function('let x=true;return x')()
  }catch(e){
    return false
  }
}

console.log(detectLet())

但也请注意,您不能有条件地使用新语法,或尝试捕获语法错误,因为语法错误发生在代码开始运行之前!

所以,要有条件地使用这样的功能,还需要eval,这更糟糕...

if(detectLet()){
  let foo='bar';
}
//SyntaxError if `let` isn't supported
if(detectLet()){
  eval("let foo='bar';") //Wait... really?!
}
//No errors

结论:

如果您需要支持不支持let 的(那些非常老的)平台,那么不要使用let。

或者,您可以使用 Babel 等工具转译您的代码

但截至 2021 年,all major browsers support let (even IE!!!),所以您可以安全地使用它,并放弃对真正旧版浏览器的支持。

【讨论】:

  • 当你对你正在做的事情有绝对的控制权时,使用 eval 还不错,就是这样。
  • @MáximaAlekz 确实如此,但是eval 确实很慢,而且你必须把代码放到一个字符串中,这很难维护(没有语法高亮,运行时不会立即报告语法错误代码,linters 通常不检查字符串中的代码,您必须转义某些字符,并且 ES5 中没有适当的多行字符串)。所以这里不是邪恶,只是很糟糕。
【解决方案2】:

尽管它很邪恶,但在这种情况下,您可以使用 eval(),只要您不评估任何用户输入。将其包装在 try/catch 语句中,您可以检查它是否会引发语法错误。

语法错误本身是不可捕获的,因此您不能简单地在 let 语句周围添加 try/catch 语句。

出于演示目的,我添加了一个使用虚构的“foobar”关键字的示例:

var canLet = false;
try {
  eval('let foobar = "baz";');
  canLet = true;
} catch (e) {}

console.log("this browser does" + (canLet ? '' : ' not') + " support the let keyword");

var canFoobar = false;
try {
  eval('foobar baz = "bar";');
  canLet = true;
} catch (e) {}

console.log("this browser does" + (canFoobar ? '' : ' not') + " support the foobar keyword");

【讨论】:

  • 好答案! ??
  • eval 并不总是邪恶的,如果你控制了你在 eval 中的一切,那么 eval 就不是邪恶的
【解决方案3】:

let 语句是在 EcmaScript 标准 ES2015(“ES6”)中引入的,所有主流浏览器都支持它。除非您针对的是旧版浏览器,否则您无需担心。

注意:在 IE 11 中,for 循环内的let 语句的行为类似于var 变量(即,它的作用域不是每次迭代,而是作用于整个for 循环)

【讨论】:

  • 没错,但 OP 要求进行程序检测...见this comment
【解决方案4】:

如果你真的需要检测浏览器是否支持 let,你可以编写一个简单的特征检测,如下面的 sn-p。 为了不导致语法错误,您可以使用 eval (这不是邪恶的;)

function testLet() {
  try {
    eval("let test;");
    return true;
  } catch (e) {
    return false;
  }
}

console.info(testLet())

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 2018-06-01
    • 2018-02-24
    • 2015-06-26
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多