2011-02-16 11 views
8

Son zamanlardaki kod örneklerini işlevlerin değişkenlere yerleştirmesini ve ardından normal işlevlerini çağırmasını gördüm.Fonksiyonlar değişkenlerin içine yerleştirerek JavaScript avantajı?

As:

var myFunctionName = function() { 
    Code Here... 
} 

myFunctionName(); 

Ben daha gelişmiş senaryolarla bir çok avantajı vardır eminim, ama ben sadece merak ediyorum.

+2

ilk yanıt Makaleyi Oku - http://stackoverflow.com/questions/1013385/what-is-the-difference-between- a-function-expression-vs-declaration-in-javascript Makaleye doğrudan bağlantı - http://kangax.github.com/nfe/ – leebriggs

cevap

12

Hiçbir avantajı yoktur, bir işleviiçine yerleştirmiyorsunuz, bir işlevi basitçe farklı bir şekilde adlandırıyorsunuz.

function foo() { /* ... */ } 
var foo = function() { /* ... */ } 

Bunlar tam olarak bir şey hariç aynıdır.

Bu çalışır:

foo("Hello!"); 
/* Later on... */ 
function foo() { /* ... */ } 

Bu işe yaramazsa:

foo("Hello!"); 
/* Later on... */ 
var foo = function() { /* ... */ } 

JavaScript yorumlayıcısı çalıştırmadan önce önişleyebilir tüm function foo 'ler ve bunlar böylece programın üstüne onları zorlayacak mevcut ancak var foo = function 's ile yapmaz.

+1

Biraz düşünülmüş bir egzersiz için, var foo = function bar(); Bar === foo mu? – leebriggs

+0

@leeeb: Hayır, 'foo! == bar'. –

+0

Yardım için teşekkürler! – Qcom

2

Bir bildirimle yapamayacağınız bir işlev ifadesiyle yapabileceğiniz bazı şeyler vardır.

  • hemen çağrılabilir olabilir ve bundan küresel ad alanında değilseniz değişken

  • saklanan dönüş değeri, bir küresel

oluşturmak için var anahtar kelimeyi çıkarabiliyordunuz

DÜZENLEME:

İşte hemen bir çağrı için bir örnek. Hemen çağrılan işlevde bulunan değişkenlere ve parametreye erişimi olan myFunctionName değişkenine bir işlev döndürür.

var myFunctionName = function(v) { 
     // do something with "v" and some scoped variables 
     // return a function that has access to the scoped variables 

    return function() { 
     // this function does something with the scoped variables 
    }; 
}('someVal'); 

    // now this function is the only one that has access 
    // to the variables that were scoped in the outer expression. 
myFunctionName(); 

Burada işlev sayısal bir değerini korumaktadır bir örnek verilmiştir. Sayımı eklemek için bir sayı vererek tekrar tekrar işlevini çağırabilirsiniz. Geçerli değere her zaman başvurur, böylece her çağrı birikimlidir.

Örnek: Bu işlev bildiriminde biraz daha farklı bir davranış olan bir işlev ifadesi, adıhttp://jsfiddle.net/5uuLa/1/

var counter = function(value) { 

    return function(addValue) { 
     value += ~~addValue; 
     return value; 
    }; 
}(10); // initialize with a value 

    // each call builds on the result of the previous  
console.log(counter(2)); // 12 
console.log(counter(5)); // 17 
console.log(counter(3)); // 20 
console.log(counter(7)); // 27 
console.log(counter(1)); // 28 
+0

Güzel açıklama ve örnekler, çok teşekkürler! – Qcom

4

. Diğer şeylerin yanı sıra, başvurduğunuz zaman farklı şekilde davranır.Örneğin, bunu yaparsanız:

var myFunctionName = function() { 
    Code Here... 
} 
Sen arayın veya atanmış sonrasına kadar işlevine bakın edemez

,

function myFunctionName() { 
    Code Here... 
} 

oysa önce bile, aynı kapsamda herhangi bir yere sevk edilebilir beyan. Bunun nedeni, tüm işlev bildirimlerinin sahnelerin arkasındaki kod bloğunun üstüne taşındığı "kaldırma" adı verilen Javascript'teki bir özelliktir.

Ayrıca Bakınız:

What is the difference between a function expression vs declaration in JavaScript?

http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

+1

Linkler için teşekkürler! – Qcom