Çalışmıyor çünkü a olarak ayrıştırılıyor FunctionDeclaration
ve işlev bildirimlerinin ad tanımlayıcısı zorunludur .
Parantez içine aldığınızda, a olarak değerlendirilir FunctionExpression
ve işlev ifadeleri adlandırılıp adlandırılamaz.
Bir FunctionDeclaration
görünüşün grameri şöyle:
function Identifier ( FormalParameterListopt ) { FunctionBody }
Ve FunctionExpression
s:
function Identifieropt ( FormalParameterListopt ) { FunctionBody }
Görebileceğiniz gibi Identifier
(Tanımlayıcı seçeneği ) belirteci FunctionExpression
isteğe bağlıdır, bu nedenle tanımlanmış bir ad olmadan işlev ifadesine sahip olabiliriz:
(function () {
alert(2 + 2);
}());
Veya adlandırılmış işlev ifadesi:
(function foo() {
alert(2 + 2);
}());
Parantezler (resmi olarak Gruplama İşleci olarak adlandırılır ) yalnızca ifadeleri çevreleyebilir ve bir işlev ifadesi değerlendirilir.
İki dilbilgisi prodüksiyonu belirsiz olabilir ve örneğin tamamen aynı görünebilir:
function foo () {} // FunctionDeclaration
0,function foo () {} // FunctionExpression
Ayrıştırıcı , göründüğü bağlama göre a FunctionDeclaration
veya a olup olmadığını bilir .FunctionExpression
Yukarıdaki örnekte, ikincisi bir ifadedir, çünkü Virgül operatörü de yalnızca ifadeleri işleyebilir.
Öte yandan, FunctionDeclaration
s sadece " Program
" kod adı verilen kodda, yani global kapsamın dışında ve FunctionBody
diğer fonksiyonların içinde kod anlamına gelebilir .
Blokların içindeki işlevlerden kaçınılmalıdır, çünkü öngörülemeyen bir davranışa yol açabilirler, örneğin:
if (true) {
function foo() {
alert('true');
}
} else {
function foo() {
alert('false!');
}
}
foo(); // true? false? why?
Yukarıdaki kod aslında bir a üretmelidir SyntaxError
, çünkü a Block
yalnızca ifadeler içerebilir (ve ECMAScript Spesifikasyonu herhangi bir işlev ifadesi tanımlamaz), ancak çoğu uygulama toleranslıdır ve uyarı veren ikinci işlevi alır 'false!'
.
Mozilla uygulamaları -Rhino, SpiderMonkey - farklı bir davranışa sahiptir. Gramerleri standart olmayan bir İşlev İfadesi içerir, yani işlevin s ile olduğu gibi ayrıştırma zamanında değil, çalışma zamanında değerlendirileceği anlamına gelir FunctionDeclaration
. Bu uygulamalarda ilk işlevi tanımlayacağız.
İşlevler farklı şekillerde bildirilebilir , aşağıdakileri karşılaştırın :
1- Değişkene atanan İşlev yapıcısı ile tanımlanan bir işlev çarpılır :
var multiply = new Function("x", "y", "return x * y;");
2- multiply adlı bir fonksiyonun fonksiyon beyanı :
function multiply(x, y) {
return x * y;
}
3- Değişkene atanan fonksiyon ifadesi çarpılır :
var multiply = function (x, y) {
return x * y;
};
4- adlandırılmış bir fonksiyonu ifade FUNC_NAME değişken tahsis çarpma :
var multiply = function func_name(x, y) {
return x * y;
};