Javascript 使用eval执行函数
关于eval是如何工作的,我有点不明白。 假设我有一个函数foo:Javascript 使用eval执行函数,javascript,Javascript,关于eval是如何工作的,我有点不明白。 假设我有一个函数foo: function foo() { console.log("test"); } 然后我写 eval("foo()"); 或 执行函数foo,并打印“test”。 然而,如果我写: eval("function foo() { console.log(\"foo\"); }();"); 或 我得到“SyntaxError:意外令牌”。 为什么呢?我看到当我传递函数名时,它被计算到函数的代码中,所以我认为它应该与“ev
function foo() {
console.log("test");
}
然后我写
eval("foo()");
或
执行函数foo,并打印“test”。
然而,如果我写:
eval("function foo() { console.log(\"foo\"); }();");
或
我得到“SyntaxError:意外令牌”。
为什么呢?我看到当我传递函数名时,它被计算到函数的代码中,所以我认为它应该与“eval”(“foo”+“();”)相同
我正在使用Chrome 27,如果有什么不同的话。你需要打电话给我
eval("function foo() { console.log(\"foo\"); };" + " foo();");
为了让这一切顺利进行 您需要打电话
eval("function foo() { console.log(\"foo\"); };" + " foo();");
eval("(function() { console.log(\"foo\"); })()");
为了让这一切顺利进行
eval("(function() { console.log(\"foo\"); })()");
这称为自执行匿名函数
这称为一个自动执行的匿名函数。函数x(){}
是一个语句,而您所做的一切都是一个表达式,您只能对表达式求值
其他答案解释了如何将此语句转换为表达式。我想我会让你知道为什么会出现错误 函数x(){}
是一条语句,而您所做的一切都是一个表达式,您只能对表达式求值
其他答案解释了如何将此语句转换为表达式。我想我会让你知道为什么会出现错误 用括号括起你的函数
eval("(function foo() { console.log(\"foo\"); })()");
就像打电话一样
(function foo() { console.log("foo"); })()
用括号括起你的函数
eval("(function foo() { console.log(\"foo\"); })()");
就像打电话一样
(function foo() { console.log("foo"); })()
关于eval,你应该了解的主要一点是它是邪恶的。不要用它。。。曾经总有一种方法可以通过动态创建脚本文档或使用闭包来实现相同的目标
阅读Douglas Crockford:JavaScript的优点。关于eval,你应该了解的主要一点是它是邪恶的。不要用它。。。曾经总有一种方法可以通过动态创建脚本文档或使用闭包来实现相同的目标
阅读Douglas Crockford:JavaScript的好部分。因为没有关于最后一个代码段失败原因的具体答案,而且似乎没有人警告您使用
eval的危险:
eval
,根据:
表示JavaScript表达式、语句或语句序列的字符串。表达式可以包含现有对象的变量和属性
字符串,“function foo(){console.log('foo');}()”
实际上由2条语句组成,这对JS引擎来说毫无意义。好吧,第二个没有:
function foo(){console.log('foo');}//function declaration, fine
;//<-- js adds implied statement terminator
()//no invocation, because no function reference, group nothing ==> does not compute, raise error
函数声明现在是一个表达式,所有内容(包括的分组()
)都可以看作是一个语句,除非后面的代码属于上面的代码。在本例中,调用括号显然起作用,因此JS引擎会为您进行排序。
为了清楚起见,有人说首选符号是:
(function f(){}());//<-- invoking parentheses inside group
都是同样有效的。请注意,它们将更改函数表达式的可能返回值
(function(){}());//resolves to undefined
+function(){}();//resolves to NaN, because undefined is NotANumber
那么,您的eval
的外观是以下任何一种:
eval("(function (){console.log('foo');}());");
eval("~function (){console.log('foo');}();");
eval("!function (){console.log('foo');}();");
等等,等等
最后,eval
对全局范围内的代码进行求值,因此任何包含函数的代码eval
-ed都可能会对全局名称空间造成污染。恶意代码也可以访问所有内容,因此对XSS攻击和所有其他基于JS的技术感到厌倦。
总之,eval
是邪恶的,特别是因为现在所有浏览器都在本地支持JSON.parse
,对于那些不支持的浏览器,仍然有一个经过测试的JSON2.js文件。
在严格模式下使用eval
确实使事情稍微安全一些,但根本不能防止XSS攻击,例如,代码仍然可以操纵DOM,并重新分配公开的DOM引用或对象
如果您想了解更多信息,请使用谷歌“why eval is evil”。
另外因为没有关于最后一个代码段失败原因的具体答案,而且似乎没有人警告您使用eval的危险:
eval
,根据:
表示JavaScript表达式、语句或语句序列的字符串。表达式可以包含现有对象的变量和属性
字符串,“function foo(){console.log('foo');}()”
实际上由2条语句组成,这对JS引擎来说毫无意义。好吧,第二个没有:
function foo(){console.log('foo');}//function declaration, fine
;//<-- js adds implied statement terminator
()//no invocation, because no function reference, group nothing ==> does not compute, raise error
函数声明现在是一个表达式,所有内容(包括的分组()
)都可以看作是一个语句,除非后面的代码属于上面的代码。在本例中,调用括号显然起作用,因此JS引擎会为您进行排序。
为了清楚起见,有人说首选符号是:
(function f(){}());//<-- invoking parentheses inside group
都是同样有效的。请注意,它们将更改函数表达式的可能返回值
(function(){}());//resolves to undefined
+function(){}();//resolves to NaN, because undefined is NotANumber
那么,您的eval
的外观是以下任何一种:
eval("(function (){console.log('foo');}());");
eval("~function (){console.log('foo');}();");
eval("!function (){console.log('foo');}();");
等等,等等
最后,eval
对全局范围内的代码进行求值,因此任何包含函数的代码eval
-ed都可能会对全局名称空间造成污染。恶意代码也可以访问所有内容,因此对XSS攻击和所有其他基于JS的技术感到厌倦。
总之,eval
是邪恶的,特别是因为现在所有浏览器都在本地支持JSON.parse
,对于那些不支持的浏览器,仍然有一个经过测试的JSON2.js文件。
在严格模式下使用eval
确实使事情稍微安全一些,但根本不能防止XSS攻击,例如,代码仍然可以操纵DOM,并重新分配公开的DOM引用或对象
如果您想了解更多信息,请使用谷歌“why eval is evil”。
另外,函数foo()
中的foo
也不是必需的;-)对,因为它是匿名的。我只是复制了上面的内容并用括号括起来。(以上编辑)你的答案是c