2016-12-17 4 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が不要なように感じます。オブジェクトをすぐに返すだけであれば、同じことになります。何か不足していますか?

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

それはあまりにも、私には不要になります。 – Barmar

+0

IIFEが引数を取っていればそれは意味がありますが、それでもそれらは囲み関数内の変数にすぎません。 – Barmar

答えて

0

はい私は何かが欠けているとは思わない。

閉鎖の作成を示すために作成されました。オブジェクトを返すだけであれば、それは1つではありません(しかし、最良の例ではありません)。そのウェブサイトで著者の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

関連する問題