读es-checker源码遇到的一点问题
发布于 7 年前 作者 783010296 3422 次浏览 来自 问答

最近在读一些工具的源码,借此学习一下,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,按照这个工具的代码来看,应该会返回一些东西。不得其解,谢谢!

8 回复

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;
    })();
}

From PWA CNode

@Lizhooh 是的,理解了,是我对Function的参数没理解透

回到顶部