为了账号安全,请及时绑定邮箱和手机立即绑定

val()和新函数()是同一回事吗?

val()和新函数()是同一回事吗?

慕后森 2019-08-03 14:03:57
val()和新函数()是同一回事吗?这两个函数在幕后做同样的事情吗?(单语句函数)var evaluate = function(string) {     return eval('(' + string + ')');}var func = function(string) {     return (new Function( 'return (' + string + ')' )());}console.log(evaluate('2 + 1'));console.log(func('2 + 1'));
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

不,他们是同样的。

  • eval()

    将字符串计算为当前执行范围内的JavaScript表达式,并可以访问局部变量。
  • new Function()

    将存储在字符串中的JavaScript代码解析为函数对象,然后调用函数对象。它无法访问局部变量,因为代码在单独的作用域中运行。

考虑以下代码:

function test1() {
    var a = 11;
    eval('(a = 22)');
    alert(a);            // alerts 22}

如果new Function('return (a = 22);')()使用,局部变量a会保留它的价值。尽管如此,一些JavaScript程序员,如道格拉斯·克罗克福德(Douglas Crocford)认为两者都不应使用除非绝对必要,以及评估/使用Function不受信任数据的构造函数是不安全和不明智的。



查看完整回答
反对 回复 2019-08-04
?
守候你守候我

TA贡献1802条经验 获得超10个赞

new Function创建一个可重用的函数。eval只需执行给定的字符串并返回最后一个语句的结果。您的问题被误导了,因为您试图创建一个包装器函数,该函数使用函数来模拟val。

他们在窗帘后面分享了一些代码,这是真的吗?是的,很有可能。完全相同的密码?不,当然。

为了好玩,下面是我自己不完美的实现,它使用val来创建函数。希望它能为不同之处提供一些启示!

function makeFunction() {
  var params = [];
  for (var i = 0; i < arguments.length -  1; i++) {
    params.push(arguments[i]);
  }
  var code = arguments[arguments.length -  1];


 // Creates the anonymous function to be returned
 // The following line doesn't work in IE
 // return eval('(function (' + params.join(',')+ '){' + code + '})');
 // This does though
 return eval('[function (' + params.join(',')+ '){' + code + '}][0]');}

这个函数和新函数最大的区别是,函数没有在词汇上限定作用域。这样它就不能访问闭包变量,而我也可以访问。



查看完整回答
反对 回复 2019-08-04
  • 3 回答
  • 0 关注
  • 341 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信