var ninja = (function(){
function Ninja(){};
return new Ninja();
})();
为什么上面的函数封装在括号中,为什么最后会有();
?
我认为它是一个构造函数,因为最后是();
,但为什么对象用括号括起来?
答案 0 :(得分:11)
此代码相当于:
function Ninja() {
// nothing here
}
var ninja = new Ninja();
虽然在您列出的代码中,函数/对象Ninja不是全局范围。
代码(function() {...})();
基本上表示“将此处包含的任何函数立即执行并立即执行”。所以它创建了一个匿名函数并在之后调用它。
答案 1 :(得分:5)
它被称为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);
};
虽然我想在this.property
中引用$('.el').each()
,但this
更改了该范围内的含义,并引用了使用.each()
循环的当前DOM元素。因此,通过将this
作为参数传递到IIFE(并调用该参数obj
),我可以使用obj.property
在{{1}范围之外引用this.property
。 1}}。
请告诉我这是否有意义或者您有任何疑问:)
答案 2 :(得分:1)
为什么函数声明封装在'('s'以及为什么是 有一个'();'最后
同时声明并执行该函数。
您可能会看到:Named function expressions demystified - by Juriy "kangax" Zaytsev
答案 3 :(得分:0)
根据建议:参考Benalman
立即调用函数表达式(IIFE) 幸运的是,SyntaxError“修复”很简单。告诉解析器期望函数表达式的最广泛接受的方式只是包含在parens中,因为在JavaScript中,parens不能包含语句。此时,当解析器遇到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