它可能会让某些人感兴趣并节省几个小时,一个讨厌的捆绑问题,eval来自一个文件,而函数来自第二个文件。
eval('console.log(0)')
(function(x){console.log(x)})(1)
将导致:未捕获的TypeError:eval(...)不是函数
这是修复
eval('console.log(0)');
(function(x){console.log(x)})(1)
缺少分号,我几次读过JS中的分号几次。
为什么eval在这种情况下不是函数的任何注释?
答案 0 :(得分:6)
JS运行时并不能完全猜测分号应该去哪里。
当它看到这个时:
eval('console.log(0)')
(function(x){console.log(x)})(1)
它错误地假设立即调用的函数表达式的结果是eval
行的一部分(要传递给eval
求值的潜在函数的潜在参数)。
以下是一个可行的例子:
eval("(function(message){ alert(message); })")
("Hi there!");

但是,在您的情况下,eval
没有评估函数,因此尝试向其传递参数会失败,从而导致错误消息。
但是,它实际上与eval()
关系不大。这可以在IIFE之前省略分号或任何以(
开头的表达式时弹出。
添加分号,允许运行时知道IIFE是独立的。
规则是你必须在(
之后的任何一行插入半冒号(因为这是表达式的开始),以便将它们分开。但是,更好的规则是完全不依赖于自动分叉插入并始终将它们放在自己身上。
答案 1 :(得分:1)
这是Javascript的semicolon insertion会让你失望的少数情况之一。
此代码:
for col in columns1:
if col.upper() in [x.upper() for x in columns2]:
z = columns2.index(col)
print(col, 'Matches with', columns2[z] )
else:
print(col, 'DOES NOT Match With')
output:
Dog Matches with Dog
ValueError: 'cat' is not in list
等同于此代码:
eval('console.log(0)')
(function(x){console.log(x)})(1)
换句话说,Javascript认为表达式eval('console.log(0)')(function(x){console.log(x)})(1)
评估您尝试使用参数eval('console.log(0)')
调用的函数。这显然不是你想要的,所以你需要在行尾添加分号。