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

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'));


慕后森
浏览 342回答 3
3回答

繁华开满天机

不,他们是不同样的。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不受信任数据的构造函数是不安全和不明智的。

守候你守候我

new Function创建一个可重用的函数。eval只需执行给定的字符串并返回最后一个语句的结果。您的问题被误导了,因为您试图创建一个包装器函数,该函数使用函数来模拟val。他们在窗帘后面分享了一些代码,这是真的吗?是的,很有可能。完全相同的密码?不,当然。为了好玩,下面是我自己不完美的实现,它使用val来创建函数。希望它能为不同之处提供一些启示!function&nbsp;makeFunction()&nbsp;{ &nbsp;&nbsp;var&nbsp;params&nbsp;=&nbsp;[]; &nbsp;&nbsp;for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;arguments.length&nbsp;-&nbsp;&nbsp;1;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;params.push(arguments[i]); &nbsp;&nbsp;} &nbsp;&nbsp;var&nbsp;code&nbsp;=&nbsp;arguments[arguments.length&nbsp;-&nbsp;&nbsp;1]; &nbsp;//&nbsp;Creates&nbsp;the&nbsp;anonymous&nbsp;function&nbsp;to&nbsp;be&nbsp;returned &nbsp;//&nbsp;The&nbsp;following&nbsp;line&nbsp;doesn't&nbsp;work&nbsp;in&nbsp;IE &nbsp;//&nbsp;return&nbsp;eval('(function&nbsp;('&nbsp;+&nbsp;params.join(',')+&nbsp;'){'&nbsp;+&nbsp;code&nbsp;+&nbsp;'})'); &nbsp;//&nbsp;This&nbsp;does&nbsp;though &nbsp;return&nbsp;eval('[function&nbsp;('&nbsp;+&nbsp;params.join(',')+&nbsp;'){'&nbsp;+&nbsp;code&nbsp;+&nbsp;'}][0]');}这个函数和新函数最大的区别是,函数没有在词汇上限定作用域。这样它就不能访问闭包变量,而我也可以访问。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript