Javascript JS中的更多IIFE说明,让您更了解Java
我仍然对那些直接调用的函数表达式有点困惑。我得到了范围闭包(我读过Crockford的书),但是@plalx好心地给我写了一个例子,说明我在使用IIFE时的另一个疑问(最后链接到JSFIDLE)。这又让我有点困惑,我是怎么想的 在Java中,人们会认为:Javascript JS中的更多IIFE说明,让您更了解Java,javascript,function,iife,Javascript,Function,Iife,我仍然对那些直接调用的函数表达式有点困惑。我得到了范围闭包(我读过Crockford的书),但是@plalx好心地给我写了一个例子,说明我在使用IIFE时的另一个疑问(最后链接到JSFIDLE)。这又让我有点困惑,我是怎么想的 在Java中,人们会认为: type doSome(type input){ do_stuff return same type }; 后来 doSome(data); 所以在js中我也可以这么做,对吗 function doSome(input){ do_stuff
type doSome(type input){
do_stuff
return same type
};
后来
doSome(data);
所以在js中我也可以这么做,对吗
function doSome(input){
do_stuff;
return someThing;
}
后者:
doSome(data);
doSome(data);
或是更常用的生活方式:
var doSome = (function(data){
do_stuff;
return something
})();
后者:
doSome(data);
doSome(data);
到目前为止我说的对吗
所以我的问题是:在这种情况下,为什么要用生命而不是其他方式?
引起这种怀疑的两个代码都在JSFIDLE中:
IIFE对于使用闭包保存对“私有”变量的引用非常有用。它们可用于防止其他人修改您想要保护的值,或保存只需执行一次(或偶尔)但函数经常使用的计算结果
document.body.innerHTML = deaccentuate(s);
e、 g.要获取元素的文本,您可以编写:
function getText(el) {
if (typeof el.textContent == 'string') {
return el.textContent;
} else if (typeof el.innerText == 'string') {
return el.innerText;
}
}
但为了避免每次都要进行测试,可以使用IIFE,测试只需执行一次:
var getText = (function() {
var d = document.createElement('div');
if (typeof div.textContent == 'string') {
return function (el) {
return el.textContent;
};
} else if (typeof div.innerText == 'string') {
return function (el) {
return el.innerText;
};
}
}());
因此,测试只执行一次。您还可以使用类似的策略保留对全局对象的引用:
var someFn = (function (global) {
// in here, you are certain that global references the global object
return function() {
// and in here too
};
// And here's where it comes from
}(this));
IIFE对于使用闭包保存对“私有”变量的引用非常有用。它们可用于防止其他人修改您想要保护的值,或保存只需执行一次(或偶尔)但函数经常使用的计算结果
document.body.innerHTML = deaccentuate(s);
e、 g.要获取元素的文本,您可以编写:
function getText(el) {
if (typeof el.textContent == 'string') {
return el.textContent;
} else if (typeof el.innerText == 'string') {
return el.innerText;
}
}
但为了避免每次都要进行测试,可以使用IIFE,测试只需执行一次:
var getText = (function() {
var d = document.createElement('div');
if (typeof div.textContent == 'string') {
return function (el) {
return el.textContent;
};
} else if (typeof div.innerText == 'string') {
return function (el) {
return el.innerText;
};
}
}());
因此,测试只执行一次。您还可以使用类似的策略保留对全局对象的引用:
var someFn = (function (global) {
// in here, you are certain that global references the global object
return function() {
// and in here too
};
// And here's where it comes from
}(this));
这两个示例之间的主要区别在于函数体的求值频率 在本例中:,对于IIFE,内部代码只计算一次,然后返回函数。当您通过运行函数时
document.body.innerHTML = deaccentuate(s);
它只执行返回的函数体,而不执行之前的语句
在另一个例子中:
每次运行deaccentuate(s)
函数时,都会对整个函数体进行评估
document.body.innerHTML = deaccentuate(s);
因此,如果您有一些繁重的操作,您只想在运行时执行一次,或者像@RobG对私有成员所说的那样,在本例中使用IIFE
您可以通过在两个示例的顶部添加console.log(“whatever”)
来验证这一点
->与/7一起使用/
及
->使用/8/这两个示例之间的主要区别在于函数体的求值频率 在本例中:,对于IIFE,内部代码只计算一次,然后返回函数。当您通过运行函数时
document.body.innerHTML = deaccentuate(s);
它只执行返回的函数体,而不执行之前的语句
在另一个例子中:
每次运行deaccentuate(s)
函数时,都会对整个函数体进行评估
document.body.innerHTML = deaccentuate(s);
因此,如果您有一些繁重的操作,您只想在运行时执行一次,或者像@RobG对私有成员所说的那样,在本例中使用IIFE
您可以通过在两个示例的顶部添加console.log(“whatever”)
来验证这一点
->与/7一起使用/
及
->使用/8/iLife将立即启动,因此它与上面的函数不同。IIFE是一个要立即执行的函数,因此它与调用
function init(){/**/}相同;init()代码>使用(函数(/**/){})(
如果你在生活中返回的东西是一个函数,那么你可以doSome(数据)
否则它类似于将doSome设置为一个值。@asafreedman这是有意义的,plalx这样做了,返回了一个函数!现在我明白了:)非常感谢。iLife将立即启动,因此它与上面的函数不同。IIFE是一个要立即执行的函数,因此它与调用function init(){/**/}相同;init()代码>使用(函数(/**/){})(
如果你在生活中返回的东西是一个函数,那么你可以doSome(数据)
否则它类似于将doSome设置为一个值。@asafreedman这是有意义的,plalx这样做了,返回了一个函数!现在我明白了:)非常感谢。谢谢,如果我理解正确,你会通过调用getText(element)
调用IIFE版本,对吗?谢谢,如果我理解正确,你会通过调用getText(element)
调用IIFE版本,对吗?这也是正确的,我希望能够接受这两个答案,但我不能,多谢!这也是正确的,我希望能够接受这两个答案,但我不能,所以加倍感谢!