3

在某些情况下,在单个 JavaScript 文件中有多个自调用函数会引发错误。让第二个函数返回一个值可以避免错误。

我有一个准系统 HTML 文件...

<script src="two.js"></script>
<script src="one.js"></script>

...使用这些脚本:

// two.js
(function () {
  console.log('1/2')
})()

(function () {
  console.log('2/2')
})()

    

// one.js
(function () {
  console.log('1/1')
})()

当我在 Chrome 中打开文件时,我得到以下输出:

1/2 two.js:2
Uncaught TypeError: undefined is not a function two.js:6
1/1

其他浏览器以自己的方式抱怨。换句话说,在同一个脚本中有两个自调用函数会导致问题。每个脚本都有一个自调用函数可以正常工作。如果我把第二个函数脚本two.js注释掉,就没有问题了。

但是,如果我让第二个函数返回一个值,那么也没有问题。如果我将 two.js 更改为此,一切正常:

(function () {
  console.log('1/2')
})()

foo = (function () {
  console.log('2/2')
  return 'bar'
})()

为什么第一个版本失败,第二个版本成功?

4

2 回答 2

5

您忘记了分号:

(function () {
  console.log('1/2')
})();

(function () {
  console.log('2/2')
})();

否则,前一个表达式 ( ) 的返回值会undefined尝试执行下一个表达式。显然undefined不是函数。

在无分号的 JavaScript 世界中,您经常会在任何原始表达式之前看到分号,例如()

;(function(){}())
;['1','2','3'].map(Number)

JavaScript将尝试填写您“忘记”的分号,但这些表达式不明确,因此您需要添加它。

于 2013-12-19T00:59:02.433 回答
2

您在函数表达式的末尾缺少分号,因此前面的括号表达式被解析为对函数的调用。由于函数不返回值(返回值是隐式undefined的),代码在功能上等同于undefined()- 因此错误。

故事的寓意 - 不要忘记你的分号!

于 2013-12-19T01:00:26.957 回答