SORU
16 Temmuz 2009, PERŞEMBE


Neden aynı hat üzerinde anonim bir fonksiyonu çağırmak için ihtiyacınız var mı?

Kilitler hakkında bazı yazılarını okuyordum ve bu her yerde gördüm, ama nasıl çalışır - her zaman kullanacağını söyledi net bir açıklama yok...:

// Create a new anonymous function, to use as a wrapper
(function(){
    // The variable that would, normally, be global
    var msg = "Thanks for visiting!";

    // Binding a new function to a global object
    window.onunload = function(){
        // Which uses the 'hidden' variable
        alert( msg );
    };
// Close off the anonymous function and execute it
})();

Tamam yeni bir anonim işlev oluşturun ve yürütün olacağını görüyorum. Yani bu basit bir kod çalışması gerekir sonra (ve):

(function (msg){alert(msg)})('SO');

Benim sorum burada ne olur? Ne zaman yazdım diye düşündüm:

(function (msg){alert(msg)})

sonra yeni isimsiz bir fonksiyon gibi oluşturulmuş olur ""(hata) ...

ama peki neden çalışmıyor?

(function (msg){alert(msg)});
('SO');

Neden aynı satırda olmak zorunda mı?

Bana gelin lütfen bazı mesajlar ya da bana bir açıklama verebilir misiniz?

CEVAP
16 Temmuz 2009, PERŞEMBE


Fonksiyon tanımından sonra noktalı virgül bırakın.

(function (msg){alert(msg)})
('SO');

Yukarıda çalışması gerekir.

DEMO Sayfa: http://jsbin.com/ujazi

Kod: http://jsbin.com/ujazi/edit

Bu yazı desen bu tür tartıştık:

jQuery and $ questions

DÜZENLEME:

ECMA script specification, eğer bir fonksiyon tanımlayabilirsiniz 3 yolu vardır. (Sayfa 98, Bölüm 13 Fonksiyonlar)

1. Fonksiyon oluşturucu kullanarak

var sum = new Function('a','b', 'return a   b;');
alert(sum(10, 20)); //alerts 30

2. İşlev bildirimi kullanarak.

function sum(a, b)
{
    return a   b;
}

alert(sum(10, 10)); //Alerts 20;

3. İfade Fonksiyonu

var sum = function(a, b) { return a   b; }

alert(sum(5, 5)); // alerts 10

Sorabilirsiniz yani, beyan ve ifade arasındaki fark nedir?

Komut şartname ECMA:

FunctionDeclaration : işlev Tanımlayıcısı ( FormalParameterListopt ){ FunctionBody }

FunctionExpression : fonksiyon İdentifieropt ( FormalParameterListopt ){ FunctionBody }

Eğer dikkat ederseniz, ''. tanımlayıcı ^strong>isteğe bağlıişlev ifadesi için. Ve bir tanımlayıcı vermeyince, isimsiz bir işlev oluşturun. Tanımlayıcı belirtmeniz olamaz anlamına gelmez.

Bunun anlamı şu geçerlidir.

var sum = function mySum(a, b) { return a   b; }

Unutulmaması gereken önemli nokta 'mySum' sadece içinde mySum işlevi vücut dışında. kullanabilirsiniz. Bakın aşağıdaki örnek:

var test1 = function test2() { alert(typeof test2); }

alert(typeof(test2)); //alerts 'undefined', surprise! 

test1(); //alerts 'function' because test2 is a function.

Live Demo

Bu karşılaştırın

 function test1() { alert(typeof test1) };

 alert(typeof test1); //alerts 'function'

 test1(); //alerts 'function'

Bu bilgi ile silahlı, kodunuzun analiz etmeye çalışın.

Gibi bir kod var

    function(msg) { alert(msg); }

İşlev ifadesi yarattı. Ve parantez içinde sararak bu fonksiyonu ifade çalıştırabilirsiniz.

    (function(msg) { alert(msg); })('SO'); //alerts SO.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Helen Bradley

    Helen Bradle

    4 Mart 2008
  • Jejoab

    Jejoab

    4 NİSAN 2008
  • SunsetTrance

    SunsetTrance

    20 EYLÜL 2008