2016-12-17 62 views
3

前段时间,我在this网站上发现了关于关闭的半个不错的解释。他们为我们提供了以下工厂函数看到工作闭合:Javascript - 为什么返回封闭与IIFE?

var car; 
function carFactory(kind) { 
    var wheelCount, start; 
    wheelCount = 4; 
    start = function() { 
    console.log('started with ' + wheelCount + ' wheels.'); 
    }; 

    // Closure created here. 
    return (function() { 
    return { 
     make: kind, 
     wheels: wheelCount, 
     startEngine: start 
    }; 
    }()); 
} 

car = carFactory('Tesla'); 

// => Tesla 
console.log(car.make); 

// => started with 4 wheels. 
car.startEngine(); 

为什么这个人返回的盖,即返回与他想要共享的属性的对象立即调用的函数表达式(IIFE) ?我觉得IIFE是不必要的。如果我马上返回对象,这会导致同样的结果。我错过了什么吗?

//Closure created here 
    return{ 
    make: kind, 
    wheels: wheelCount, 
    startEngine: start 
    }; 
+4

它看起来不需要我了。 – Barmar

+0

如果IIFE接受了参数,那么它会更有意义,但即使如此,它们也可能只是封闭函数中的变量。 – Barmar

回答

0

是的我不认为你错过了任何东西。

只是为了显示闭包的创建。如果你只是返回对象,它不会被认为是一个(虽然不是最好的例子)。

据笔者在该网站的comment

您需要自动执行功能,因为这是该行为是 创建关闭。 JavaScript只具有函数级作用域,所以 只能通过调用函数 将自由变量绑定到封闭作用域中。

0

这可能是有道理的,如果carFactory()应该是一些对象的方法。然后返回对象(作为自调用函数)的这个将被改变。

var obj = {}; 
 

 
obj.funA = function(){ 
 
    return { 
 
    getThis:this 
 
    }; 
 
}; 
 

 
obj.funB = function(){ 
 
    return (function(){ 
 
    return { 
 
     getThis:this 
 
    }; 
 
    })(); 
 
} 
 

 
console.log(obj.funA()); //object 
 
console.log(obj.funB()); //window