Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检查';让';浏览器是否支持?_Javascript_Html - Fatal编程技术网

Javascript 如何检查';让';浏览器是否支持?

Javascript 如何检查';让';浏览器是否支持?,javascript,html,Javascript,Html,检查我的浏览器是否支持let命令以声明变量仅对当前代码块有效的最佳方法是什么 这不是问题的重复,因为问题涉及FF中的非标准语法扩展,并且未发布eval/函数解决方案 我需要执行此检查,以将使用旧浏览器的用户重定向到建议他们更新浏览器的站点。let语句是在EcmaScript标准ES2015(“ES6”)中引入的,所有主要浏览器都支持它。除非你的目标是老浏览器,否则你不必担心它 注意:在IE 11中,let语句在for循环中的行为类似于var变量(即,它不适用于每次迭代,但适用于整个for循环)这

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

这不是问题的重复,因为问题涉及FF中的非标准语法扩展,并且未发布
eval
/
函数
解决方案


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

let
语句是在EcmaScript标准ES2015(“ES6”)中引入的,所有主要浏览器都支持它。除非你的目标是老浏览器,否则你不必担心它


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

这是检测新语法或关键字的唯一方法(或者,将其传递给更好的对象):

函数detectLet(){
试一试{
return!!新函数('let x=true;return x')()
}捕获(e){
返回错误
}
}
console.log(detectLet())
但还要注意,您不能有条件地使用新语法,也不能尝试捕捉语法错误,因为语法错误发生在代码开始运行之前

因此,要有条件地使用这样的功能,您还需要
eval
,这更糟糕

if(detectLet()){
让foo='bar';
}
//如果不支持'let',则SyntaxError
if(detectLet()){
等等,真的吗?!
}
//没有错误
结论:

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

或者,您可以使用以下工具传输代码:


但从2021年起,您可以安全地使用它,并放弃对真正的传统浏览器的支持。

尽管它有缺点,但在这种情况下,您可以使用
eval()
,只要您不评估任何用户输入。将它包装在try/catch语句中,您可以检查它是否抛出语法错误

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

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

var canLet=false;
试一试{
评估('let foobar=“baz”);
canLet=真;
}捕获(e){}
log(“此浏览器不支持”+(canLet?“”:“not”)+“支持let关键字”);
var canFoobar=false;
试一试{
评估('foobar baz=“bar”);
canLet=真;
}捕获(e){}

log(“此浏览器不支持”+(canFoobar?“”:“'not')+”foobar关键字”)如果您确实需要检测浏览器是否支持let,您可以编写一个简单的功能检测,如下面的代码片段。 为了不引起语法错误,您可以使用eval(这里不是邪恶的;)

函数testLet(){
试一试{
评估(“let test;”;
返回true;
}捕获(e){
返回false;
}
}

console.info(testLet())
您的意思是如何签入您的代码,还是在参考网站上进行检查?可能是@FrankerZ的副本我不相信这能回答问题。OP似乎在试图找到一种方法(在代码中/在运行中)来确定他是否可以使用
let
。是的,我需要一个代码片段来检测let是否被支持。这是真的,但OP要求进行编程检测。。。看到好答案了!eval并不总是邪恶的,如果你控制了你在eval中放入的所有东西,那么eval就不是邪恶的。当你完全控制了你正在做的事情时,eval也不坏,情况就是这样。@MáximaAlekz这是真的,但是
eval
非常慢,你必须将代码放入字符串中,这很难维护(没有语法突出显示,在运行代码时不会立即报告语法错误,linter通常不会在字符串中检查代码,您必须转义某些字符,并且ES5中没有正确的多行字符串)。因此,这不是坏事,只是不好。