javascript - eval 不是函数

标签 javascript syntax eval

<分区>

它可能会引起某些人的兴趣并节省几个小时,这是一个讨厌的捆绑问题,eval 来自一个文件,函数来自第二个文件。

eval('console.log(0)')
(function(x){console.log(x)})(1)

将导致:Uncaught TypeError: eval(...) is not a function

这是解决办法

eval('console.log(0)');
(function(x){console.log(x)})(1)

缺少分号,大多数时候我读过几次 JS 中可选的分号。

为什么 eval 不是这个上下文中的函数有什么意见吗?

最佳答案

JS 运行时在猜测分号应该放在哪里方面并不完美。

当它看到这个时:

eval('console.log(0)')
(function(x){console.log(x)})(1)

它错误地假设立即调用的函数表达式的结果是 eval 行的一部分(一个潜在的参数将被传递给 eval 评估的潜在函数到)。

这是一个何时可行的示例:

eval("(function(message){ alert(message); })")
("Hi there!");

但是,在您的情况下,eval 未对函数求值,因此尝试将参数传递给它会失败,因此您会收到错误消息。

但是,它实际上与 eval() 关系不大,尤其是。只要在 IIFE 或任何以 (.

开头的表达式之前省略分号,它就会弹出。

添加分号,让运行时知道 IIFE 是独立的。

规则是您必须在后面跟有 ((因为这是表达式的开始方式)的任何行上插入分号,以便将它们分开。但是,更好的规则就是完全不依赖自动分号插入,而是始终将它们放在自己的位置。

关于javascript - eval 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44117435/

相关文章:

javascript - 将 2 个 google 图表数据表合并到 1 个

javascript - console.log 不是 nodejs fs.readfile 中的函数

javascript - mat-chip 的(单击)中的 ExpressionChangedAfterItHasBeenCheckedError

javascript - jQuery - 有没有比 "parent().parent().parent()"更好的语法

javascript - angularjs,在路由中使用一个函数作为templateUrl

python - 对象与类变量

python - 为什么 python 允许三引号作为多行注释和字符串文字

python - 禁止在 Python 中访问 exec 和 eval 中的文件系统

ruby - 为 `class << self` 内的 eval 提供回溯的正确方法是什么?

Python-使用导入的 CSV 数据自动变量命名