ES2015'te adlandırılmış bir ok işlevini nasıl yazarım?
Sorunuzu dışladığınız şekilde yaparsınız: Bir ödevin veya özellik başlatıcısının sağ tarafına, değişken veya özellik adının JavaScript motoru tarafından bir ad olarak makul bir şekilde kullanılabileceği yere koyarsınız. Bunu yapmanın başka bir yolu yok, ancak bunu yapmak doğru ve tam olarak şartname kapsamındadır.
Özelliklere göre, bu işlevin gerçek bir adı vardır sayHello
:
var sayHello = name => {
console.log(name + ' says hello');
};
Bu, Atama İşleçleri> Çalışma Zamanı Semantiği: Değerlendirme işlemini soyut SetFunctionName
işlemi çağırdığı yerde tanımlanır (bu çağrı şu anda 1.e.iii adımındadır).
Benzer şekilde, Çalışma Zamanı Semantiği: PropertyDefinitionEvaluation çağırır SetFunctionName
ve böylece bu işleve gerçek bir ad verir:
let o = {
sayHello: name => {
console.log(`${name} says hello`);
}
};
Modern motorlar zaten böyle ifadeler için işlevin dahili adını ayarlar; Edge hala name
çalışma zamanı bayrağının arkasındaki işlev örneğinde olduğu gibi kullanılabilir .
Örneğin, Chrome veya Firefox'ta web konsolunu açın ve ardından bu snippet'i çalıştırın:
"use strict";
let foo = () => { throw new Error(); };
console.log("foo.name is: " + foo.name);
try {
foo();
} catch (e) {
console.log(e.stack);
}
Chrome 51 ve üstü ve Firefox 53 ve üstü (ve deneysel bir işaretle Edge 13 ve üstü), bunu çalıştırdığınızda şunları görürsünüz:
foo.name: foo
Hata
foo'da (http://stacksnippets.net/js:14:23)
http://stacksnippets.net/js:17:3
Not foo.name is: foo
ve Error...at foo
.
Chrome 50 ve öncesi, Firefox 52 ve öncesi ve deney bayrağı olmayan Edge'de, bunun yerine Function#name
(henüz) mülke sahip olmadıkları için bunu görürsünüz :
foo.name:
Hata
foo'da (http://stacksnippets.net/js:14:23)
http://stacksnippets.net/js:17:3
Adı eksik olduğunu not foo.name is:
, ancak bir yığın izleme gösterilmiştir. Sadece name
özelliğin fonksiyon üzerinde uygulanmasının diğer ES2015 özelliklerinden daha düşük önceliğe sahip olması; Chrome ve Firefox şimdi var; Edge'de bir bayrağın arkasında var, muhtemelen bayrağın arkasında çok daha uzun olmayacak.
Açıkçası, bu işlevi ancak tanımladıktan sonra kullanabilirim
Doğru. Ok işlevleri için işlev bildirimi sözdizimi yoktur , yalnızca işlev ifadesi sözdizimi yoktur ve işlev ifadesi ( var f = function foo() { };
) adında eski bir stildeki ada eşdeğer bir ok yoktur . Yani şuna eşdeğer yok:
console.log(function fact(n) {
if (n < 0) {
throw new Error("Not defined for negative numbers");
}
return n == 0 ? 1 : n * fact(n - 1);
}(5)); // 120
Bunu iki ifadeye bölmelisiniz ( yine de yapmanız gerektiğini iddia ediyorum ) :
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
console.log(fact(5));
Eğer değilse, doğal olması tek ifade gereklidir nereye koymak için her zaman ... bir ok işlevini kullanabilirsiniz:
console.log((() => {
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
return fact(5);
})()); // 120
Bunun güzel olduğunu söylemiyorum, ama kesinlikle tek bir ifade sarmalayıcısına ihtiyacınız varsa işe yarıyor.