一个脚本中有多个自调用函数的错误:分号的大小写
Error with multiple self-invoking functions in one script: a case for a semicolon
在某些情况下,在单个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
其他浏览器以自己的方式抱怨。换句话说,在同一脚本中具有两个自调用函数会导致问题。每个脚本有一个自调用函数可以正常工作。如果我注释掉第二个函数脚本两个.js,则没有问题。
但是,如果我让第二个函数返回一个值,那么也没有问题。如果我更改两个.js,一切正常:
(function () {
console.log('1/2')
})()
foo = (function () {
console.log('2/2')
return 'bar'
})()
为什么第一个版本失败而第二个版本成功?
你忘了分号:
(function () {
console.log('1/2')
})();
(function () {
console.log('2/2')
})();
否则,前一个表达式(undefined
)的返回值会尝试执行下一个表达式。显然undefined
不是一个函数。
在无分号的 JavaScript 世界中,您经常会在任何原始表达式之前看到分号,例如 ()
:
;(function(){}())
;['1','2','3'].map(Number)
JavaScript 会尝试填写你"忘记"的分号,但这些表达式是不明确的,所以你需要添加它。
函数表达式末尾缺少分号,因此前面的括号表达式被解析为对函数的调用。由于该函数不返回值(返回值隐式undefined
),因此代码在功能上等同于undefined()
- 因此错误。
故事的寓意 - 不要忘记你的分号!
相关文章:
- XMLHttpRequest:需要使用ajax中的成功和错误函数
- Javascript 错误:函数预期
- 未捕获的引用错误:函数未使用 onchange 定义
- 如何让jQueryajax执行错误函数
- 未定义未捕获的引用错误函数
- $.ajax在跨域url上不返回错误函数
- jQuery.ajax+php5.3-始终执行错误函数
- javascript未捕获类型错误函数ajax
- 在 Promise 调用的错误函数回调后附加对象的用法是什么
- Ajax 请求在 HandleUnauthorizedRequest 之前命中错误函数
- 引用错误:“函数”未定义
- 黑莓 10 级联 ajax 调用从 javascript 总是执行错误函数
- Ajax 调用弹簧控制器回调错误函数
- 未定义未捕获的引用错误函数
- 主干.js - n捕获异常:语法错误:函数构造函数:无法编译函数
- 引用错误:函数未定义错误
- “未捕获的引用错误:(函数)未定义”与焦点事件
- JavaScript 未捕获的引用错误函数未定义 单击时
- 引用错误:函数未定义
- 类型错误: [函数名称] 不是函数,在猫鼬和节点.js中