duc*_*cin 1 javascript function
自一段时间以来,我一直在使用JS进行编程,但是从未遇到过使用立即函数的需求,例如:
(function(){
console.log('hello, I am an immediate function');
}())
Run Code Online (Sandbox Code Playgroud)
如果我只写以下内容,会有什么区别:
console.log('hello, I am an immediate function');
Run Code Online (Sandbox Code Playgroud)
?无论如何,我无权使用此功能(未在任何地方分配该功能)。我认为(但我不确定)我可以在没有即时功能的情况下实现所有功能-那么人们为什么要使用它呢?
更新:
我发现了这个问题,我在哪里做了关于闭包的更多详细信息,并以少量图纸完成以阐明闭包的使用方式以及函数作用域(以及它们如何为您提供帮助)。
作为函数对象的IIFE是在JS中创建实际作用域的唯一方法。他们到处都是。您曾经使用过jQuery或其他库吗?那么您已经使用了使用IIFE的代码。
曾经研究过node.js吗?然后,您可能会遇到称为“模块模式”的东西。
如果您愿意编写自己的构造函数,那么您可能想知道如何在对象上拥有某种私有属性。答案是IIFE一次又一次。
另外:DOM api并不是世界上最快的东西。具有包含硬编码document.getElementById调用的函数意味着,每次调用该函数时,都会遍历DOM。那不理想。解决此问题的快速简便方法是:
var f = (function(domReference)
{
var visible = !!(domReference.style.visibility === 'block')
return function()
{//has access to vars and arguments of outer function
domReference.style.visibility = visible ? 'none' : 'block';
visible = !visible;
}
}(document.getElementById('foobar'));
Run Code Online (Sandbox Code Playgroud)
但是也许最好,最常见的例子是循环中的超时/间隔:
for (var i=0;i<10;i++)
{
setTimeout((function(currentI)
{
return function()
{
console.log(currentI);
console.log(i);
}
}(i)), 1000);
Run Code Online (Sandbox Code Playgroud)
在这里,currentI将记录0、1、2 ...,依此类推,而i将始终记录10。究其原因是超时回调没有得到自己的副本中i的值,但它引用变量i。该变量可以根据需要任意更改其值,当调用超时回调时,它将记录i上一次分配的值。i定义回调时未分配值。
无需赘述,我提到了对象的私有属性。好吧,这是一个示例,供您弄清楚为什么IIFE和功能范围至关重要,并且是JS强大的壮举:
var MyConstructor = (function()
{
return function(foo, bar)
{
var initState = Array.prototype.slice.apply(arguments, [0]);
this.getInit = function()
{
return initState;
};
this.foo = foo;
this.bar = bar;
}
}());
(function(constant)
{
var F = function(args)
{
return MyConstructor.apply(this, args);
},
checkVar = constant || 'default constant value';
F.prototype = MyConstructor.prototype;
MyConstructor.prototype.getConstant = function()
{
if (constant !== checkVar)
{//bad example
return checkVar;
}
return constant;
};
MyConstructor.prototype.regularMethod = function()
{
return this.foo;
};
MyConstructor.prototype.copyFromInitState = function()
{
return new F(this.getInit());
};
}('Immutable value'));
Run Code Online (Sandbox Code Playgroud)
玩得开心...:P