!function () {}();
Run Code Online (Sandbox Code Playgroud) 这是一系列关于JavaScript中语法的问题.这也是社区Wiki,因此邀请每个人参与维护此列表.
Stack Overflow不允许搜索特定字符.因此,在搜索运算符和其他语法标记时,很难找到许多关于运算符和其他语法标记的问题.这也使得关闭重复更加困难.以下列表是为了解决此问题.
主要思想是在Stack Overflow上链接现有问题,因此我们更容易引用它们,而不是复制ECMAScript规范中的内容.
此外,这是PHP符号引用的公然副本.我们需要一个JS.
请帮忙.编辑并添加指向其他运算符/语法参考的链接,或者如果您无法在特定语法上找到好的问题/答案,请添加此问题的答案并将其链接
可能重复:
感叹号在功能之前做了什么?
我今天第一次看到了这样的格式化的函数:
!function(){}();
Run Code Online (Sandbox Code Playgroud)
前面的感叹号是什么?我认为它的功能与:
(function(){})();
Run Code Online (Sandbox Code Playgroud)
但是......这里发生了什么?
创建模块的常见做法是将它们包装在parens中,这样就不会泄漏模块外的任何变量(连接时等).
还有voidoperator,它计算给定的表达式并返回undefined.(见MDN)
我想知道在parens中使用包装函数而不是使用包装函数的原因是什么void.它是历史的,是否与连接有关?
我知道,当其中一个文件缺少分号时,你可能会遇到连接问题,直到你注意到它为止会导致令人讨厌的问题.
说,module1.js(注意缺少的逗号):
(function () {
return function () {
console.log('module1. I should not be called');
};
})()
Run Code Online (Sandbox Code Playgroud)
和,module2.js:
(function () {
return function () {
console.log('module2. I should not be called either');
};
})();
Run Code Online (Sandbox Code Playgroud)
如果将这些脚本连成一个包,它将产生以下结果:
(function () {
return function () {
console.log('module1. I should not be called');
};
})()(function () {
return function () {
console.log('module2. I should not be called either');
};
})();
Run Code Online (Sandbox Code Playgroud)
由于两个模块(文件)都返回一个函数,所以第二个假定的IIFE成为第一个模块的 …
我创建了一个js库(MessageBus.js)并使其与requirejs兼容.现在我想使用不带requirejs的同一个lib,即创建对象(新的MessageBus()).
我正在用这篇文章附上我的lib.
define([], function () {
var MessageBus = function () {
this.channelCallBackMap = {};
this.alreadyRegistred = false;
}
MessageBus.prototype = {
publish: function (channel, message) {
//Put original message and channel in the envelope and send it
var envelope = {
channel: channel,
message: message
};
var domain = location.protocol + '//' + location.host;
//Send message to all sibling iframes in the parent document
$("iframe", parent.document.body).each(function (i, frame) {
frame.contentWindow.postMessage(JSON.stringify(envelope), domain);
});
},
subscribe: function (channels, callbacks) {
var …Run Code Online (Sandbox Code Playgroud) Airbnd建议我这样做:
!function() {
// ...
}();
Run Code Online (Sandbox Code Playgroud)
因为:
这可确保如果格式错误的模块忘记包含最终分号,则在脚本连接时,生产中不会出现错误.
爆炸让我可以解决语言的语法规则:
// Evaluated in Chromium 34 console.
function(){}(); // => SyntaxError: Unexpected token (
!function(){}(); // => true
Run Code Online (Sandbox Code Playgroud)
当连接其他模块时,爆炸似乎可以解决问题:
!function(){}();function(){}(); // => SyntaxError: Unexpected token (
!function(){}();!function(){}(); // => true
(function(){}());!function(){}(); // => true
Run Code Online (Sandbox Code Playgroud)
然而,它似乎并不"安全",因为如果其他人的脚本末尾没有分号:
!function(){}()!function(){}(); // => SyntaxError: Unexpected token !
(function(){}())!function(){}(); // => SyntaxError: Unexpected token !
Run Code Online (Sandbox Code Playgroud)
看起来领先的分号IIFE更好.
;(function() {
// ...
}());
!function(){}();(function(){}()); // => undefined
(function(){}());(function(){}()); // => undefined
!function(){}();;(function(){}()); // => undefined
(function(){}());;(function(){}()); // => undefined …Run Code Online (Sandbox Code Playgroud) 可能重复:
感叹号在功能之前做了什么?
我正在查看Twitter Bootstrap JavaScript代码,我注意到他们所有的插件都包含在否定自我调用函数中.
我知道function ($) { ... }(window.jQuery);立即调用该函数.
但是!为了什么?
javascript jquery negate twitter-bootstrap self-invoking-function