我理解自我执行的匿名函数是什么,但我无法理解我将使用它们的原因以及原因。这可能是因为我经常使用jQuery。能否提供一些好的用例示例?
答案 0 :(得分:8)
基本上,自动执行的匿名函数(在技术上更简称为IIFE或立即调用的函数表达式)与声明命名函数然后立即调用它相同。与IIFE的唯一区别在于它没有名称,所以它只能在原地执行(不能从其他地方调用),因此不会为当前命名空间添加名称。
因此,您可以随时使用一个函数内部有一堆代码,并且只需要在当前定义的上下文中调用该代码。
一些常见的地方:
在任何涉及一些局部变量和一些异步操作(ajax,timeout等等)的循环中,您希望在异步完成函数中为每个循环迭代分别访问这些局部变量。 / p>
封装一些运行一次的顶级代码,使用它自己的范围和自己的私有局部变量,并与全局命名空间分开。
出于任何原因创建未命名的函数范围。
示例:
循环索引(每次调用setTimeout()
时单独冻结循环索引):
for (var i = 0; i < max; i++) {
// capture the loop index into in a closure
(function(index) {
setTimeout(function() {
console.log(index);
}, 2000);
})(i);
}
顶级代码封装(创建不在全局范围内的私有但持久的变量):
(function() {
var cntr = 0;
window.getUniqueId = function() {
return ++cntr;
};
})();
在代码中创建本地可用的快捷变量,否则这些快捷变量将成为顶级范围。
function Dictionary(initialData) {
// call parent constructor
Set.apply(this, arguments);
}
(function() {
// inherit from Set
var proto = Dictionary.prototype = new Set();
var base = Set.prototype;
// Set constructor back to us
proto.constructor = Dictionary;
// override of the base class .add()
// add(key, value)
// add(Dictionary)
// add({key1: value1, key2: value2})
proto.add = function(arg1, arg2) {
if (arg1 instanceof Set) {
// call base class to just add another Set
base.add.call(this, arg1);
} else if (typeof arg1 === "object") {
// cycle through the object and add all properties/values to the Set
for (var prop in arg1) {
if (arg1.hasOwnProperty(prop)) {
this._add(prop, arg1[prop]);
}
}
} else if (typeof arg2 !== "undefined") {
// must be add(key, value)
this._add(arg1, arg2);
}
return this;
}
proto.get = function(key) {
return this.data[key];
}
// See rest of code here: https://github.com/jfriend00/Javascript-Set/blob/master/dictionary.js
})();
答案 1 :(得分:0)
您所指的是IIFE。
它以几种常见方式使用:
(function() {
var foo = 123;
$(".pop-up-trigger").click(function() {
// ...
});
}());
创建&#34;私有变量&#34;在JavaScript中。通过声明一些局部变量,然后返回一些函数,这些函数可以访问这些局部变量(分配它们或获取值)。在IIFE之外,没有代码可以触及那些局部变量,因此它们是私有的。
创建范围。 JavaScript没有块范围,但只有函数范围,因此通过创建函数并调用它,可以创建一个新的范围。