高级JavaScript:为什么这个函数用括号括起来
Advanced JavaScript: Why is this function wrapped in parentheses?
可能重复:
JavaScript中的(function(){})()构造是什么?
我遇到了这段JavaScript代码,但我不知道该如何利用它。为什么我运行这段代码时会得到"1"?(1)的这个奇怪的小附录是什么?为什么函数用括号括起来?
(function(x){
delete x;
return x;
})(1);
这里发生了一些事情。首先是立即调用函数表达式(IIFE)模式:
(function() {
// Some code
})();
这提供了一种在自己的范围内执行某些JavaScript代码的方法。它的使用通常是为了使函数中创建的任何变量都不会影响全局范围。你可以用这个代替:
function foo() {
// Some code
}
foo();
但这需要为函数指定一个名称,而这并不总是必需的。使用命名函数也意味着在将来某个时候可以再次调用该函数,这可能是不可取的。通过以这种方式使用匿名函数,可以确保它只执行一次。
此语法无效:
function() {
// Some code
}();
因为您必须将函数包装在括号中,以便将其解析为表达式。更多信息请点击此处:http://benalman.com/news/2010/11/immediately-invoked-function-expression/
因此,快速回顾IIFE模式:
(function() {
// Some code
})();
允许"某些代码"立即执行,就好像它只是内联编写的一样,但也在它自己的范围内执行,以免影响全局命名空间(从而可能干扰或被其他脚本干扰)。
您可以像传递普通函数一样,将参数传递给函数,例如
(function(x) {
// Some code
})(1);
因此,我们将值"1"作为第一个参数传递给函数,该函数将其作为本地范围的变量接收,名为x.
其次,您拥有函数代码本身的核心:
delete x;
return x;
delete操作符将删除对象的属性。它不会删除变量。所以
var foo = {'bar':4, 'baz':5};
delete foo.bar;
console.log(foo);
记录的结果:
{'baz':5}
然而,
var foo = 4;
delete foo;
console.log(foo);
将记录值4,因为foo是一个变量而不是属性,因此无法删除。
由于自动全局的工作方式,许多人认为delete可以删除变量。如果分配给一个变量而不首先声明它,它实际上不会变成一个变量,而是全局对象上的一个属性:
bar = 4; // Note the lack of 'var'. Bad practice! Don't ever do this!
delete bar;
console.log(bar); // Error - bar is not defined.
这一次删除有效,因为您不是在删除变量,而是在删除全局对象上的属性。实际上,前面的代码段相当于:
window.bar = 4;
delete window.bar;
console.log(window.bar);
现在您可以看到它是如何类似于foo对象示例而不是foo变量示例的。
这意味着您创建了一个匿名函数,并使用参数1
调用它。
它与相同
function foo(x) {
delete x;
return x;
}
foo(1);
返回1的原因是delete关键字用于删除对象的属性。其余的正如其他人所评论的那样,任何封装在括号中的东西都作为一个函数执行,第二组括号是传递给该块的参数。
以下是删除的MDN引用和闭包的MDN参考,其中还讨论了匿名函数。
人们通常称这些为"立即调用函数表达式"或"自执行函数"。
这样做的目的是,在该函数内部声明的变量不会泄漏到外部。
- PHP函数的返回看起来如何对AJAX和PHP有效
- 给定一个带有数字的数组,我如何编写一个递归函数,当 2 个元素加起来为一个目标时,它会在数组中查找索引
- Knockout JS-将函数名与数组值连接起来
- 如何在javascript中创建看起来像点符号的自定义函数?例如str.getFirstIndex();
- 调用一个位于字符串内部的JavaScript函数,并将params与一个变量连接起来
- 如果函数'It’It’跑起来太久了
- 将匿名函数中的 JavaScript 与 gulp 连接起来
- JavaScript:$ 不是一个函数(但看起来是)
- 如何将 Javascript/Jquery 函数与 html 表单连接起来
- (函数表达式){使用分组运算符将函数表达式括起来}是否实际有效
- JavaScript之谜:2个在构造函数,原型和__proto__链接方面看起来相同的对象,行为不同
- JS:有没有办法在点击函数中调用滚动函数,或者两者结合起来
- 将咖喱函数与 lodash 链接起来
- 如何将javascript和jQuery函数组合起来隐藏按钮
- D3 示例:看起来像一个 JavaScript 变量,但像一个函数一样调用
- 为什么jquery's的parseXML函数在XML看起来正常时失败
- 有没有办法将函数与用户控制关联起来
- 高级JavaScript:为什么这个函数用括号括起来
- 如何将同步函数与承诺链接起来以异步运行
- 将d3.js与jquery函数调用结合起来