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
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:
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.
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.
birden çok olay aynı fonksiyonu tetikl...
Neden diğerleri üzerinde bazı platform...
Neden GCC neredeyse aynı C kodu için t...
Neden küçük bir liste daha küçük bir d...
Neden döngü için bir Python yineleyici...