检查浏览器是否支持 let 命令以声明仅对当前代码块有效的变量的最佳方法是什么?
这不是问题2356830的重复项,因为没有发布 eval / Function 解决方案。
我需要执行此检查,以将使用旧浏览器的用户重定向到建议其更新浏览器的网站。
答案 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())