ECMAScript Function Nesnesi (Sınıf)
- Önceki sayfa arguments nesnesi
- Sonraki sayfa Kapalı (closure)
ECMAScript'teki fonksiyonlar gerçekten tamamen işlevsel nesnelerdir.
Function nesnesi (sınıf)
ECMAScript'te en ilgi çekici olan şey, fonksiyonların aslında tamamen işlevsel nesneler olması olabilir.
Function sınıfı, geliştirici tarafından tanımlanan herhangi bir fonksiyonu temsil edebilir.
Function sınıfı ile doğrudan fonksiyon oluşturma dilbilgisi şu şekildedir:
var function_name = new function()arg1, arg2, ... , argN, function_body)
Yukarıdaki formatta, her arg Tümü aynı parametredir, son parametre fonksiyon gövdesidir (çalıştırılacak kod). Bu parametreler string olmalıdır.
Bu fonksiyonu hatırlıyor musunuz?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
Bu şekilde tanımlanabilir:
var sayHi = new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");
String ilişkileri nedeniyle bu formatta yazmak biraz zor olabilir, ancak fonksiyonların yalnızca bir referans türü olduğunu ve Function sınıfı ile açıkça oluşturulan fonksiyonların davranışlarıyla aynı olduğunu anlamaya yardımcı olabilir.
Aşağıdaki örneği görün:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); //Çıktı "20"
Bilindiği gibi, ikinci fonksiyon birinci fonksiyonu yeniden yüklemiştir ve doAdd(10) çıktısını "20" olarak değil "30" olarak vermiştir.
Eğer bu kod bloğu aşağıdaki gibi yeniden yazılırsa, bu kavram daha net hale gelir:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
Bu kodu gözlemleyin, açıkça doAdd'nın değeri farklı bir nesneye işaret eden bir işaretçiye değiştirilmiştir. Fonksiyon adı, diğer nesneler gibi davranan fonksiyon nesnesine işaret eden bir referans değeridir.
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); //Çıktı "20" alsodoAdd(10); //Çıktı "20"
Burada, değişken doAdd fonksiyon olarak tanımlanmıştır, ardından alsodoAdd aynı fonksiyona işaret eden bir işaretçi olarak ilan edilmiştir. Bu iki değişkenle de fonksiyonun kodunu çalıştırabilir ve aynı sonucu elde edebilirsiniz - "20". Bu nedenle, fonksiyon adı sadece fonksiyona işaret eden bir değişkense, fonksiyonu başka bir fonksiyona parametre olarak vermek mümkün mü? Cevap evet!
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); //Çıktı "20"
Yukarıdaki örnekte, callAnotherFunc() iki parametre içerir - çağrılacak fonksiyon ve bu fonksiyona iletilen parametreler. Bu kod, doAdd() fonksiyonunu callAnotherFunc() fonksiyonuna 10 parametresi ile iletir ve "20" çıktısını verir.
Dikkat:Function yapıcı fonksiyonunu kullanarak fonksiyon oluşturmak mümkündür, ancak onu kullanmak en iyi uygulamalar arasında yer almaz, zira bu yöntemle fonksiyon tanımlamak, geleneksel yöntemden çok daha yavaş olabilir. Ancak, tüm fonksiyonlar Function sınıfının örnekleridir.
Function nesnesinin length özelliği
Daha önce belirtildiği gibi, fonksiyonlar referans türündedir, bu yüzden de özellikleri ve yöntemlere sahiptir.
ECMAScript tarafından tanımlanan length özelliği, fonksiyonun beklediği parametre sayısını belirtir. Örneğin:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); //Çıktı "1" alert(sayHi.length); //Çıktı "0"
doAdd() fonksiyonu bir parametre tanımladığı için length'i 1'dir; sayHi() parametre tanımlamadığı için length'i 0'dır.
Unutmayın, ne kadar fazla parametre tanımlarsanız tanımlasınız, ECMAScript her zaman istediğiniz kadar fazla parametre kabul eder (en fazla 25), bu konu 'Fonksiyon Özetleri' bölümünde anlatılmıştır. length özelliği yalnızca varsayılan olarak beklenen parametre sayısını görüntülemek için kolay bir yol sağlar.
Function nesnesi yöntemleri
Function nesnesi de tüm nesnelerle paylaşılan valueOf() ve toString() yöntemlerine sahiptir. Bu iki yöntem de fonksiyonun kaynak kodunu döndürür ve hata ayıklamada özellikle faydalıdır. Örneğin:
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
Üstteki bu kod, doAdd() fonksiyonunun metnini çıkartır.Kendi kendine deney!
- Önceki sayfa arguments nesnesi
- Sonraki sayfa Kapalı (closure)