2015-12-17 33 views
16

BenNeden işlev() {} çalışmıyor, ancak (function() {}) çalışıyor? (Chrome Geliştirme Araçları/Düğüm)

function(){} 

veya

function(a){ 
    console.log(a) 
} 

Bir atar tanımlamak olamayacağını şu anda bu garip davranışı gördüm.

Ancak test = function(){} veya (function(){}) işe yarar.

Safari dev araçları daha iyi bir hata raporu vardır: O bunu kullanmak asla eğer

SyntaxError: Function statements must have a name.

Tamam böyle bir işlevi tanımlamak için hiçbir mantıklı olduğunu söylüyor. Ama yine de tuhaf. Sanırım sorunun cevabını zaten vermiştim.

+0

Katılıyorum, FF de açık bir kesme hatası iletisine sahip bir işlev adı gereksiniminde doğrudur - SyntaxError: işlev ifadesi bir işlev gerektiriyordur çünkü – hazardous

+0

bir işlev gerektirmez çünkü işlev 'i() {}()' yapamazsınız (eğer değilse) argüman olarak kullanilabilir) ancak '(function() {})()' – Hacketo

+0

yapabileceksiniz. Birincisi tanımlanamayan fonksiyon sözdizimi ancak ikincisi bir nesne – SaidbakR

cevap

28

JavaScript, işlev bildirimlerine sahiptir ve işlev ifadeleri. İkincisi yapabildiği zaman, eskiden hemen çağrılmaz. Bu dil grameri meselesi.

Fonksiyon tanımlama: (= sağ tarafta)

function foo() { 
    // ... 
} 

Fonksiyon ifadesi: işlevi parantez ekleyerek

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

, işlevi zorluyorlar olmak bir işlev ifadesi olarak ayrıştırıldığı için, parantez içinde bir işlev bildirimi koymak mümkün değildir (yalnızca ifadeler beklenir ve kabul edilir):

(function foo() { 
    // ... 
}); 

Ardından hemen çağırabilirsiniz: Daha detaylı yazma-up için

(function foo() { 
    // ... 
})(); 

, Function Definitions in JavaScript göz atın.

+2

Lütfen standart terimin * fonksiyon bildirimi olduguna dikkat edin *. "işlev ifadesi", özel bir ES6 öncesi bir şey ifade ediyordu. – Bergi

+0

@Bergi Elbette, teşekkürler. Düzeltilmiş! –

9

(function(){})'daki parantezler, fonksiyonun değerlendirildiğini, nesnenin artık parantez içinde bulunduğunu ve bu değerlendirmenin işlevi döndürdüğünü gösterir. Şu şekilde çağrılabilir: (function(){})();.

function(){} değerlendirmez. Bunun bir hataya neden olması mantıklı, çünkü dediğiniz gibi, onu hiçbir şekilde kullanamayacaksınız.

İlgili konular