Explain the following JavaScript statement?
本问题已经有最佳答案,请猛点这里访问。
1 2 3 4 | var ninja = (function(){ function Ninja(){}; return new Ninja(); })(); |
为什么上面的函数被封装在括号中,为什么结尾有一个
我认为它是一个构造器函数,因为末尾有
此代码相当于:
1 2 3 4 5 | function Ninja() { // nothing here } var ninja = new Ninja(); |
虽然在您列出的代码中,函数/对象忍者不是全局范围。
代码
它被称为立即调用的函数表达式(或IIFE)。它创建一个新的作用域并立即执行内容。它有很多用途;我使用最多的是当
1 2 3 4 5 6 7 8 9 10 | var someClass = function() { this.property = something; this.update = (function(obj) { function() { $('.el').each(function() { $(this).html( obj.property ); }); }; )(this); }; |
虽然我想在
如果有任何问题,请告诉我。)
Why is the function declaration encapsulated in '('s and also why is
there a '();' in the end
它同时声明和执行函数。
您可能会看到:命名函数表达式被juriy"kangax"zaytsev取消了定义。
如建议:参考Benalman
立即调用的函数表达式(IIFE)幸运的是,语法错误"fix"很简单。告诉解析器期望函数表达式的最广泛接受的方法就是用parens包装,因为在javascript中,parens不能包含语句。此时,当解析器遇到函数关键字时,它知道将其解析为函数表达式而不是函数声明。
1 2 3 4 5 6 7 8 | // 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 |