如何检查浏览器是否支持“ let”?

时间:2019-09-23 13:49:11

标签: javascript html

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

这不是问题2356830的重复项,因为没有发布 eval / Function 解决方案。

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

特征检测新语法或关键字的唯一方法是对其进行eval(或将其传递给Function构造函数):

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

但是从2019年开始,所有主流浏览器都支持let(甚至IE !!!),因此您可以安全地使用它,并放弃对旧版浏览器的支持。

答案 2 :(得分:3)

尽管有其弊端,但在这种情况下,只要您不评估任何用户输入,就可以使用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");

答案 3 :(得分:2)

如果您确实需要检测浏览器是否支持let,则可以编写一个简单的功能检测,如下面的代码片段所示。 为了不引起语法错误,您可以使用eval(在这里并不邪恶;)

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

console.info(testLet())