SORU
27 EKİM 2009, Salı


'in JavaScript kapsüllü anonim işlev sözdizimi açıklar

Özet

JavaScript kapsüllenmiş anonim fonksiyonları sözdizimi arkasındaki mantık açıklayabilir misiniz? Neden bu işi yapar: (function(){})(); ama bu değil: 15**?

< / ^ hr .

Biliyorum

JavaScript bu gibi adında bir işlev oluşturur:

function twoPlusTwo(){
    alert(2   2);
}
twoPlusTwo();

Ayrıca isimsiz bir işlev oluşturmak ve bir değişkene atamak için:

var twoPlusTwo = function(){
    alert(2   2);
};
twoPlusTwo();

İsimsiz bir fonksiyon oluşturarak bir kod bloğu, sonra da parantez içinde sarma ve hemen yürütme saklanması:

(function(){
    alert(2   2);
})();

Bu, geçerli kapsam karmaşık önlemek için modüler bir yapıya kavuşturuldu komut, ya da genel kapsamlı oluştururken yararlı, potansiyel olarak çakışan değişkenler - Greasemonkey betikleri dil eklentisi eklentileri, vb olduğu gibi.

Şimdi, bu işleri anlıyorum. Parantez içindekileri alın ve sadece sonucu (bu tarif için daha iyi bir yolu vardır eminim), (2 2) === 4 gibi göstermek.

< / ^ hr .

Anlamadığım şey

Ama bu aynı derecede de neden çalışmıyor anlamıyorum:

function(){
    alert(2   2);
}();

Bana bunu açıklayabilir misin?

CEVAP
27 EKİM 2009, Salı


Bir olarak ayrıştırılmış olduğundan işe yaramıyorFunctionDeclarationfonksiyon bildirimleri adı tanımlayıcı bir parçası olarak kabul edilebilirzorunlu.

Parantez ile sardığı bir olarak değerlendirilirFunctionExpressionişlev ifadeleri adlandırılmış olabilir veya olmayabilir.

FunctionDeclaration bir dilbilgisi bu gibi görünüyor:

FunctionDeclaration :
function Identifier ( FormalParameterListopt ) {FunctionBody}

FunctionExpressions:

    FunctionExpression :
    function Identifieropt (FormalParameterListopt) {FunctionBody}

İsteğe bağlı s FunctionExpression 15 *token gördüğünüz gibi, bu nedenle adı tanımlı olmayan bir fonksiyon ifade edebiliriz:

(function () {
    alert(2   2);
}());

Yaadlandırılmışişlev ifadesi:

(function foo() {
    alert(2   2);
}());

Parantez (resmen the Grouping Operator) denilen sadece ifadeler surround ve işlev ifadesi değerlendirilir.

İki dilbilgisi productions belirsiz olabilir, yine aynı şekilde, örneğin bak:

function foo () {} // FunctionDeclaration

0,function foo () {} // FunctionExpression

Çözümleyici FunctionDeclaration veya ** 21, göre, değil mi bilmiyorbağlamgöründüğü.

Yukarıdaki örnekte, ikinci bir Comma operator ayrıca sadece ifadeler işleyebilir, çünkü bir ifadesidir.

Diğer taraftan, FunctionDeclaration'ler olabilir aslında görünen sadece ne denir "Program" kodu, anlamı kodu dışında küresel kapsam ve içinde FunctionBody diğer fonksiyonlar.

Blok içindeki fonksiyonları tahmin edilemez bir davranış, örneğin neden olabilir, çünkü kaçınılmalıdır:

if (true) {
  function foo () { alert('true'); }
} else {
  function foo () { alert('false!'); }
}

foo(); // true? false? why?

Yukarıdaki kod lazım aslında üretmek SyntaxError beri Block Bu sadece içeren ifadeleri (ve ECMA Belirtim yok tanımla herhangi bir işlev deyimi), ama çoğu uygulamaları vardır hoşgörülü ve kolayca almak ikinci işlevi, hangi uyarıları 'false!'.

Mozilla uygulamaları -Gergedan, SpiderMonkey, farklı bir davranış var. Onların dilbilgisi içerirstandart dışıBir işlev Deyimi, işlevi de değerlendirilecek yani-çalışma zamanı, FunctionDeclarations ile olur gibi çözümleme saat değil. Bu uygulamalarda ilk işlevi tanımlanmış alacağız.


Fonksiyonlar, 37**: farklı şekillerde bildirilebilir

1 - Bir fonksiyon Function kurucu değişkene atanmış ile tanımlanırçarpın:

  var multiply = new Function("x", "y", "return x * y;");

2 - bir fonksiyon adında Bir işlev bildirimiçarpın:

  function multiply(x, y) {
     return x * y;
  }

3 - İşlev ifadesi değişkene atanmışçarpın:

  var multiply = function (x, y) {
     return x * y;
  };

4 - adında Bir işlev ifadesi *func_name*, değişkene atanmışçarpın:

  var multiply = function func_name(x, y) {
     return x * y;
  };

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • engineerguy

    engineerguy

    10 Ocak 2010
  • theatre2film

    theatre2film

    12 NİSAN 2006
  • FusioNGamiing

    FusioNGamiin

    10 Temmuz 2007