2013-04-16 27 views
15

Javascript kapanışları hakkında çok şey okudum Ne için bu parantez nelerdir? Ben kapatmaJavascript Anonim Kapanış

(function(){...})();

olarak tanımlanması gerektiğini ancak http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html, bir kapatma fonksiyonu farkı veya ikinci bir yanlış nedir

(function(){...}());

diyor diyor ki mozilla.org okumaya? Sonun amacı nedir()? İçinde bazı parametreler koyar mısın? Ben iyi bir referans arıyorum.

Düzenleme: Üstelik noktalı virgül bu 'işlevi' için neden gerekli olduğu Mozilla.org

var makeCounter = function() { 
var privateCounter = 0; 
    function changeBy(val) { 
    privateCounter += val; 
    } 
    return { 
    increment: function() { 
     changeBy(1); 
    }, 
    decrement: function() { 
     changeBy(-1); 
    }, 
    value: function() { 
     return privateCounter; 
    } 
    } 
}; 

üzerine bir örnek var mı? Bildirilmesinden hemen sonra çağrılması gerekirse,() noktalı virgülden önce konmalıdır. Ama yok.

+0

O, bir anonim işlev bir kapatma var değil: Aşağıda her iki ifade FE doğrudur. – zerkms

+1

Tam kopyası [Kendiliğinden yürüten anonim işlev (IIFE) uygulaması arasındaki fark nedir] (http://stackoverflow.com/questions/16026909/what-is-the-difference-between-those-self-executing -anonymous-function-aka-iife) – zerkms

+1

olası [(...()) vs (...)() javascript kapanışları içinde yinelenen] (http://stackoverflow.com/questions/8774425/vs-in -javascript-closures) – Quentin

cevap

17

sözdizimi

(function(){...})() 

basitçe bir anında anonim işlev çağrılır. Temel kodun bildirildiği ve çağrıldığı bir işlev olduğu için, parantezlerinizi nasıl kullandığınız önemli değildir.

Kapaklar yerine kapanışları

Anlaşılır olması için

erişilebilen bir işlev kapsamı dışında bildirilen değişkenler erişimi olan bir durumu tanımlamak için kullanılır:

aşağıdaki işlevi varsa

function hello() { 
     alert("Hello"); 
    } 

Biz şu

hello() 
ile işlevini çağırabilirsiniz 0

Bu, 'merhaba' işlevini çağırır. Biz buna bir isim vermek istemem ama yine de çağırmak yoksa, o zaman yapabileceğimiz bu senaryoda, Ancak

hello çağıran önceki örnekte olduğu gibi aynı yapacak

(function hello() { 
    alert("Hello"); 
})() 

fonksiyonu adını veren hiçbir anlamı yoktur 'merhaba', bu yüzden sadece bunu kaldırabilirsiniz: orijinal soruya kullanılan notasyon olan

(function() { 
    alert("Hello"); 
})() 

.

+0

İnanıyorum ki - fonksiyon ifadesini çağırmak için her iki yöntem de aynıdır. Ve bu kapanışlar hemen çağrılan işlev ifadelerinden farklıdır. Soruyu yanlış yorumladıysam bana bildirin :) – AlanFoster

+0

, çağrı destekleri hakkında iyi bir belge var mı? –

+0

@ user1978421 Bunun için kademeli bir örnek ekledim – AlanFoster

2

Fark yoktur. Ayrıca yapabilirsiniz:

true && function(){ /* code */ }(); 
0,function(){ /* code */ }(); 

!function(){ /* code */ }(); // Facebook style 
~function(){ /* code */ }(); 
-function(){ /* code */ }(); 
+function(){ /* code */ }(); 

// with new  
new function(){ /* code */ } 
new function(){ /* code */ }() // if you need arguments then use brackets 
+2

Ve neden bu? Bu doğru, ama bir JavaScript acemi bu neden işe yaradığını anlayacağından kuşkuluyum. –

+0

Çünkü bazı durumlarda 1 karakter kaydedebilirsiniz :) – Ildar

+2

Bu demek istediğim şey değil. Örneğin. '(function() {/ * code * /}());' veya '+ function() {/ * code * /}();' function while işlevi() {/ * code * /} (); 'veya' * function() {/ * code * /}(); 'yapma? Bu satırların işlev çağrısına izin veren özellikleri nelerdir? –

7

Sizin örnek bir Immediately Invoked Function Expression veya Hayatta gösterir.Burada

  • bir işlevi Evet
  • şimdi

diyoruz 'penceresinden' yani küresel kapsamından uzak tutmak adı yok

  • geçerli: O tercümana diyor Son() içinde parametreler koyabilirsiniz. Örneğin:
    (
        function(username){ 
         alert("Hello " + username); 
        } 
    )("John Smith") 
    

    Closures

    bize ++ veya Java C gibi dillerde özel değişkenlere kabaca eşdeğerdir data hiding uygulamasına olanak tanır javascript bir özelliğidir. Bu örnekte
    function getBmiCalculator(height, weight) { 
        // These are private vars 
        var height = height; 
        var weight = weight; 
    
        function calculateBmi(){ 
         return weight/(height * height); 
        } 
        return calculateBmi; 
    } 
    
    var calc = getBmiCalculator(1.85, 90); 
    
    // calc still has access to the scope where height and weight live. 
    var bmi = calc(); 
    alert(bmi); 
    

    , yükseklik & ağırlık çöp toplama hesaplanan yok edilene kadar olamaz. & ağırlığının bulunduğu "bellek alanı" veya "kapsam" bölümü, "Kapalı Aşırı"

  • 0

    'da, gruplandırma operatörü, işlev açıklamasını parantez olmadan ve ayrıca arama parantezleri dahil olarak sarabilir. Yani

     (function() {})(); 
         (function() {}()); 
    

    Function Expression

    İlgili konular