换句话说,为什么分号插入失败,导致代码破坏。
function Foo() { }
Foo.prototype.bar = function () {
console.log("bar");
} // <------------ missing semicolon
(function () {
Foo.prototype.la = function () {
console.log("la");
};
})();
为什么JavaScript解析引擎试图将Foo.prototype.bar = function () {
与我的闭包中的内容结合起来?有什么我可以放在那个关闭会使这个明智吗?
我并不主张不用分号,期望分号插入可以节省你的时间;我只是想知道为什么(一个更有用的版本)上面的代码在我不小心离开的时候破了。
答案 0 :(得分:4)
因为它看到了(在下面的行上并且认为你想要调用上面的内容(使用下面的函数作为参数)。
答案 1 :(得分:3)
想想这样......
Foo.prototype.bar = function () { // <-- 1. function
console.log("bar");
}(function () { // <-- 2. call the 1. function, passing a function argument
Foo.prototype.la = function () {
console.log("la");
};
})(); // <-- 3. tries to invoke the return value of the 1. function,
// but "undefined" was returned.
我不喜欢将()
用于IIFE。我更喜欢其他运营商。
Foo.prototype.bar = function () {
console.log("bar");
}
void function () {
Foo.prototype.la = function () {
console.log("la");
};
}();
如果我们回到原文,并让第一个函数返回一个函数,你会看到一个函数被调用。
Foo.prototype.bar = function () { // <-- 1. function
console.log("bar");
return function() { alert('INVOKED'); }; // 2. return a function
}(function () { // <-- 3. call the 1. function, passing a function argument
Foo.prototype.la = function () {
console.log("la");
};
})(); // <-- 4. tries to invoke the return value of the 1. function,
// which will now call the returned function with the "alert()"
更新为使用@Lasse Reichstein建议的一元运算符,因为二元运算符仍将评估其左右操作数,并返回将用于赋值的结果。