最近在读一些工具的源码,借此学习一下,es-checker是阮一峰大大写的一个小工具,地址https://github.com/ruanyf/es-checker;今天在阅读时,大部分看的懂,遇到个小问题,为什么
function runIt(code) {
return (new Function(code))();
}
就可以判断code(一段es6代码)是否可以支持,而且我试了一下
function runIt(code) {
return (new Function(code))();
}
let s = "'use strict'; var a = 0o1, b = 0b10;";
console.log(runIt(s))
得到的是undefined,按照这个工具的代码来看,应该会返回一些东西。不得其解,谢谢!
https://github.com/ruanyf/es-checker/blob/81e171a5cc63db7b59c75190b4123c282a1b335e/es-checker.js#L150-L158 是用了 try catch 捕获错误。在不支持 es6 的环境下运行一些 es6 特性语法会报错,然后被捕获。 tryPassFail(‘const test = () => null’) 这样的代码在非 es6 下会返回 false。
@ianchn 谢谢你的回答,下面这段是在bin/check.js
function runSuite(title, testArray){
console.log(chalk.bold(title));
testArray.forEach(function(key){
key = getApiName(key);
var result = runTest(key);
var symbol;
var color;
if (result) {
symbol = symbols.pass;
color = 'green';
pass += 1;
} else {
symbol = symbols.fail;
color = 'red';
}
total += 1;
console.log(' ' + chalk[color](symbol) + ' ' + chalk[color](mapper[key][language]));
});
console.log('');
}
result就是返回的结果,如果返回undefined的话,根本执行不到那句green的语句,而green那段是打印支持的语法,red的是打印不支持的。不支持的捕获error返回false我可以理解。
@783010296 result 是 runTest 不是 runIt, runIt 只是一个非常基础的小组件,用来组成其他函数。返回的结果里根本没有这个函数。
@ianchn 哦,我懂了。其实我想问的是,1、为什么可以把code放进new Function(){}的参数里,用这种方式来判断? 2、还有什么其他方法吗,能不能用evel
@783010296 new Function(‘var foo = null’)() 中 foo 是声明在函数里面的,eval(‘var foo = null’) 中 foo 是声明在 eval 函数所在作用域里,用 new Function是为了避免污染作用域。
var foo = new Function(
'return "hello world"'
);
// 等同于
function foo() {
return 'hello world';
}
function runIt(code) {
return (new Function(code))();
}
let s = "'use strict'; var a = 0o1, b = 0b10;";
// 等同于
function runIt(code) {
return (function() {
'use strict';
var a = 0o1, b = 0b10;
})();
}
@Lizhooh 是的,理解了,是我对Function的参数没理解透
@ianchn 1