假设我有一个函数myFunction
,它在其正文中使用其他函数otherFunction
的结果,并且每次调用时结果都是常量。
function myFunction() {
doSomething(otherFunction());
}
过去我使用IIFE-s仅调用otherFunction
一次,因此优化代码:
var myFunction = (function() {
let otherFunctionResult = otherFunction();
return function() {
doSomething(otherFunctionResult);
};
}());
我想知道如果不使用IIFE,ES6 const
关键字是否会达到相同的结果:
function myFunction() {
const OTHER_FUNCTION_RESULT = otherFunction();
doSomething(OTHER_FUNCTION_RESULT);
}
我是否可以期望优化const
,以便只调用一次otherFunction
?这将大大简化代码。
答案 0 :(得分:1)
OTHER_FUNCTION_RESULT
被声明为const
的事实并不意味着它只被调用过一次:
function callOften(){
const test = init(); // This is a `const`, but does it get called more often?
}
function init(){
console.log('Init Called');
return 1;
}
callOften();
callOften();
callOften();

基本上,你的IIFE是做你想做的事的一种方式。
答案 1 :(得分:1)
是的,ES6中的you don't need IIFEs any more。但是,您似乎将const
与static
在其他语言中的行为混为一谈。如果只想调用otherFunction
一次,仍需要在函数外部初始化它。它看起来像这样:
var myFunction;
{ // block scope!
let otherFunctionResult = otherFunction(); // `const` works the same here
myFunction = function() {
doSomething(otherFunctionResult);
};
}
不可否认,如果你的模块有一个应该存储在非局部变量中的结果(这里是:函数),那么IIFE仍然可以更好地阅读。