JavaScript中如何用自定义匿名函数实现与new Function相同输出
核心差异说明
你的重构代码和原new Function生成的函数从根上就不一样,所以打印结果对不上:
- 原代码拼接函数体时漏了空格,
"return" + y拼完的函数体内容是return2,是无效JS语法,真调用这个fn会直接抛语法错误,根本不是返回y值的逻辑。 new Function动态生成的函数,在浏览器控制台打印时会默认带上anonymous的函数名占位,而你直接写的无名字面量函数不会显示这个标识;另外new Function生成的函数词法作用域默认指向全局,不会捕获当前代码块的局部变量,和普通函数的闭包特性完全不同。
对齐效果的实现方式
首先要明确:不存在完全等价的纯手写匿名函数写法,能100%复刻你贴的原fn的打印效果。
原因很简单:你手写函数字面量的时候,JS会在解析阶段直接检查语法,如果你真的在函数体里写return2这种错误代码,代码根本跑不起来,更别说打印函数了;而new Function是运行时动态拼接字符串生成函数,哪怕函数体是错的,也能生成出函数对象被打印出来。
如果你只是要做到打印的结构、命名和正确逻辑对齐,可以用命名函数表达式,显式给函数指定名字为anonymous,同时修正原代码的拼接空格bug:
var y = 2 // 如果非要复刻原代码的错误return2,把函数体里改成return2即可,但调用时会报错 var fn1 = function anonymous() { return 2 } console.log(fn1)
这段代码运行后打印结果为:
ƒ anonymous() { return 2 }
和你贴的原输出只有控制台默认换行的格式差异,函数名、函数体结构完全一致。
补充说明
如果你本来的目的是替换掉new Function/eval这类动态代码生成的写法,只要业务逻辑不需要真的运行时拼接任意JS代码,完全没必要纠结控制台打印的anonymous标识——这个只是控制台给动态生成函数加的显示标记,对函数的实际运行逻辑没有任何影响。
原示例里的new Function("return" + y)本身就是写错的代码,正确的动态生成返回y的函数应该在return后面加空格:new Function("return " + y),对应的静态写法直接写返回值即可,不需要追求打印字符串完全一致。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

