它可能会引起某些人的兴趣并节省几个小时,这是一个讨厌的捆绑问题,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 是独立的。
规则是您必须在后面跟有 (
(因为这是表达式的开始方式)的任何行上插入分号,以便将它们分开。但是,更好的规则就是完全不依赖自动分号插入,而是始终将它们放在自己的位置。