这里发生了一些事情。首先是immediately invoked function expression (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;
删除操作符将删除对象的属性。它不会删除变量。所以;
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.
这一次删除有效,因为您删除的不是变量,而是全局对象上的一个属性。实际上,前面的 sn-p 等价于:
window.bar = 4;
delete window.bar;
console.log(window.bar);
现在您可以看到它与 foo 对象示例而不是 foo 变量示例的相似之处。