解释以下 JavaScript 语句
Explain the following JavaScript statement?
var ninja = (function(){
function Ninja(){};
return new Ninja();
})();
为什么上面的函数封装在括号中,为什么末尾有一个();
?
我认为这是一个构造函数,因为末尾();
,但为什么对象被括在括号中?
此代码等效于:
function Ninja() {
// nothing here
}
var ninja = new Ninja();
尽管在您列出的代码中,函数/对象 Ninja 不是全局范围。
代码(function() {...})();
基本上是"获取此处包含的任何函数并立即执行它"。因此,它正在创建一个匿名函数,并在之后立即调用它。
它被称为立即调用的函数表达式(或 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
在该范围内更改了含义,并引用了当前正在循环的 DOM 元素 .each()
.因此,通过将this
作为参数传递到 IIFE(并调用该参数obj
(,我可以使用obj.property
来引用超出$('.el').each( ..., function() { ... });
范围时this.property
的内容。
让我知道这是否有意义,或者您是否有任何疑问:)
为什么函数声明封装在'('s中,以及为什么 最后有一个"((;">
它同时声明和执行函数。
您可能会看到: 命名函数表达式揭秘 - 由 Juriy "kangax" Zaytsev
正如建议: 参考贝纳尔曼
立即调用的函数表达式 (IIFE(幸运的是,SyntaxError的"修复"很简单。告诉解析器期望函数表达式的最广泛接受的方法就是用 paren 括起来,因为在 JavaScript 中,括号不能包含语句。此时,当解析器遇到函数关键字时,它知道将其解析为函数表达式而不是函数声明。
// 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
- 这个函数做什么以及如何在没有'带有'语句-Javascript
- 使用usinf-if语句javascript调用函数
- 不带花括号的If/else语句javascript
- 我怎样才能减少 if/else 语句 Javascript
- 如果其他语句 JavaScript
- 带有返回语句 JavaScript 的三元运算符
- 代码将同时执行 if 和 else 语句.Javascript
- 如果 else 语句 JavaScript
- 短音if/else语句Javascript
- 如何使用if语句javascript使游戏保存最佳分数
- 使用事件onclick访问if语句Javascript中变量的值
- "返回函数外的语句“-JavaScript错误
- 在for循环中使用if语句-Javascript
- if语句返回true,而不是遍历我的所有if语句-javascript
- 我可以't使用if语句(javascript)打印html选择菜单中的值
- 返回语句javascript
- 如何循环if/else语句(JavaScript)
- 如何在HTML中使用if语句(JavaScript)和select标记
- 多个if条件语句javascript/html
- 切换语句javascript