【发布时间】:2013-08-11 20:43:16
【问题描述】:
var ninja = (function(){
function Ninja(){};
return new Ninja();
})();
为什么上面的函数封装在括号中,为什么最后有();?
我认为它是一个构造函数,因为末尾有();,但是为什么将对象包裹在括号中?
【问题讨论】:
-
@KevinDeVoe 你的副本更好
标签: javascript
var ninja = (function(){
function Ninja(){};
return new Ninja();
})();
为什么上面的函数封装在括号中,为什么最后有();?
我认为它是一个构造函数,因为末尾有();,但是为什么将对象包裹在括号中?
【问题讨论】:
标签: javascript
这段代码相当于:
function Ninja() {
// nothing here
}
var ninja = new Ninja();
虽然在您列出的代码中,函数/对象 Ninja 不是全局范围。
代码(function() {...})(); 基本上是说“获取这里包含的任何函数并立即执行它”。所以它创建了一个匿名函数并在之后调用它。
【讨论】:
它被称为Immediately-Invoked Function Expression(或 IIFE)。它创建一个新范围并立即执行内容。它有很多用途;我使用最多的一个是this 关键字会改变含义时,例如在
var someClass = function() {
this.property = something;
this.update = (function(obj) {
function() {
$('.el').each(function() {
$(this).html( obj.property );
});
};
)(this);
};
虽然我想在$('.el').each() 内引用this.property,但this 在该范围内改变了含义,并引用了当前正在使用.each() 循环的DOM 元素。因此,通过将this 作为参数传递到 IIFE(并调用该参数obj),我可以在$('.el').each( ..., function() { ... }); 范围之外使用obj.property 来引用this.property 是什么。
让我知道这是否有意义或者如果您有任何问题:)
【讨论】:
为什么函数声明封装在'('s中,以及为什么是 有一个'();'最后
它同时声明和执行函数。
你可能会看到:Named function expressions demystified - by Juriy "kangax" Zaytsev
【讨论】:
如建议:参考Benalman
立即调用函数表达式 (IIFE) 幸运的是,SyntaxError “修复”很简单。告诉解析器期待一个函数表达式的最广泛接受的方法就是用括号括起来,因为在 JavaScript 中,括号不能包含语句。此时,解析器遇到function关键字时,就知道将其解析为函数表达式,而不是函数声明。
// Either of the following two patterns can be used to immediately invoke
// a function expression, utilizing the function's execution context to
// create "privacy."
(function(){ /* code */ }()); // Crockford recommends this one
(function(){ /* code */ })(); // But this one works just as well
【讨论】: