Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.

Makale Geçmişi

19.12.16 23:28
JavaScript Fonksiyonları: Function Yapılandırıcısı
Daha önceki makalelerimizde de belirttiğimiz gibi  fonksiyonlar birer nesnedir ve bundan dolayı her fonksiyon bir değer olarak kullanılabilir. Fonksiyon nesneleri  Function  nesnesinden türetilir. Yani  function  ile bir tanımlama yaptığınızda oluşturulan şey  Function  nesnesinin bir örneğidir, dolayısıyla bir nesne / değerdir. Function  yapılandırıcısını kullanarak fonksiyonlar oluşturabiliriz. Kullanımı: new Function([[Parametre1,[Parametre2,[...]]],[Fonksiyon Gövdesi]]); Kullanımdan anlaşılacağı gibi ilk parametreler eğer varsa fonksiyon parametrelerinin adlarını tanımlıyor. Son kullanılan parametre ise fonksiyonun gövdesini  string  olarak bildirmek için kullanılıyor. Tabi parametreler yoksa doğrudan fonksiyon gövdesini tek parametre olarak yazabilirsiniz. Veya hiç parametre veya fonksiyon gövdesi kullanmadan da tanımlayabilirsiniz. Parametreli örnek: var toplama = new Function("sayi1", "sayi2", "return sayi1 + sayi2;"); console.log(toplama(3, 5)); Çıktısı: 8 Bu örnekte tanımlanan fonksiyon şununla aynıdır: function toplama(sayi1, sayi2) { return sayi1 + sayi2; } console.log(toplama(3, 5)); Parametresiz örnek: var mesajYaz = new Function("console.log('Merhaba.');"); mesajYaz(); Çıktısı: Merhaba. Bu örnekte tanımlanan fonksiyon şununla aynıdır: function mesajYaz() { console.log("Merhaba."); } mesajYaz() Function Nesnesinin Özellik ve Metotları Function nesnesi bazı yararlı özellik ve metotlara sahiptir. Bir fonksiyonu fonksiyon bildirimi veya fonksiyon ifadesi olarak tanımladığınızda da bu özellik ve metotları kullanabilirsiniz. Function.arguments Özelliği: (Bu özellik eskimiş bir özelliktir. Bunun yerine  JavaScript Fonksiyonlari: arguments Nesnesi  makalemizde açıklanan arguments değişkenini kullanın. Ancak yine de bir çok tarayıcıda çalışır.) Function.arguments   özelliği, fonksiyona gelen parametreleri tutan dizi şeklinde bir değerdir. Örnek: function deneme(a, b) { console.log(deneme.arguments[0]); console.log(deneme.arguments[1]); console.log(deneme.arguments[2]); } deneme(1, 2); Çıktısı: 1 2 undefined Örnekte fonksiyona 3. parametre gönderilmediğinden   arguments[2]   ,  undefined   olmuştur. Function.caller Özelliği: (Bu özellik standart değildir ve standarda eklenecek özellikler listesinde de yer almamaktadır.) caller  özelliği fonksiyonu çağıran fonksiyonun referansını döndürür. Örnek: function deneme2() { console.log(deneme2.caller); } function deneme() { console.log(deneme.caller); deneme2(); } deneme(); Çıktısı: null deneme() Örnekte  deneme  fonksiyonu çağırılıyor, bu fonksiyon içinden de  deneme2  fonksiyonu çağırılıyor. Her iki fonksiyon içinden de kendilerini çağıran fonksiyonları çıktıya yazmaları isteniyor. Çıktıda görüldüğü gibi  deneme  fonksiyonu herhangi bir fonksiyon içinden çağırılmadığı için  caller ,  null  döndürülüyor. Bazı tarayıcılarda  deneme()  şeklinde bir çıktı yerine yerine fonksiyonun tamamını da görebilirsiniz. Function.length Özelliği: Bu özellik, fonksiyona gelmesi beklenen / fonksiyon tanımında belirtilen özellik sayısını döndürür. Örnek: function deneme(a, b, c) { console.log(deneme.length); } deneme(1, 2); Çıktısı: 3 Örnekte görüldüğü gibi beklenen / bildirilen parametre sayısı veriliyor. Gönderilen parametre sayısı değil. Function.displayName Özelliği: (Bu özellik standart değildir ve standarda eklenecek özellikler listesinde de yer almamaktadır.) Bu özellik bir fonksiyona atandığında, konsol veya JavaScript durum izlemelerinde (profiler) fonksiyon bu isimle gösterilir. Örnek: function deneme() { console.log(deneme.displayName); } deneme() deneme.displayName = "Deneme Fonksiyonu"; deneme(); Çıktısı: undefined Deneme Fonksiyonu Function.name Özelliği: Referansı verilen fonksiyonun adını döndürür. Örnek: function deneme() { } // Bir fonksiyon bildirimi var f = function () { }; // Bir fonksiyon ifadesi (anonim, isimsiz) var testF = function test() { }; // İsimli bir fonksiyon ifadesi var nesne = { birFonksiyon: function () { } // Bir nesne içinde fonksiyon ifadesi. , baskaFonksiyon: function baska() { } // Bir nesne içinde isimli fonksiyon ifadesi. } console.log(deneme.name); console.log(f.name); console.log(testF.name); console.log(nesne.birFonksiyon.name); console.log(nesne.baskaFonksiyon.name); Çıktısı: deneme (an empty string) test (an empty string) baska Görüldüğü gibi bir nesne içinde veya dışında tanımlanmış fonksiyon ifadelerinde eğer isim tanımlanmışsa (örnekte test) isim döndürülüyor, aksi halde boş bir string döndürüyor. ((an empty string) ifadesi, Firefox hata ayıklayıcıda çıktının boş bir metin olduğunu bildiriyor.) Eğer Edge tarayıcısında aynı örneği denerseniz, çıktı: deneme test birFonksiyon baska şeklinde olacaktır (deneme metninden sonra bir boş satır var). Function.prototype.call Metodu: Bu yöntem, bir fonksiyonu çalıştırmak için kullanılır. Kullanımı: call(thisParametresi[,Parametre1[,Parametre2,[...]]]); Bu kullanımdaki  thisParametresi  ile belirtilen ilk parametre, bir nesnenin kapsamını çağırılan fonksiyona geçirmek için kullanılır. Sonraki parametreler, fonksiyona gönderilecek parametrelerdir. Örnek: function tamAdOlustur(adi, soyadi) { this.tamAdi = adi + " " + soyadi; } function Kisi(adi, soyadi) { this.adi = adi; this.soyadi = soyadi; tamAdOlustur.call(this, adi, soyadi); } var ogretmen = new Kisi("Ahmet", "Geçe"); console.log(ogretmen.tamAdi); Çıktısı: Ahmet Geçe Örnekte  Kisi  isimli yapılandırıcı fonksiyon içinden çağırılan  tamAdOlustur  fonksiyonu doğrudan değil  call  metodu ile çağırılmıştır.  call  yönteminde gönderilen ilk parametre olan  this , oluşturulan örneğin kapsamını  tamAdOlustur  fonksiyona geçmektedir. Bundan dolayı  tamAdOlustur  fonksiyonunun içinde sanki  Kisi  fonksiyonunun içindeymiş gibi  this  kullanılabilmekte ve oluşturulan örneğin (nesnenin)  tamAdi  özelliğine bir değer atanmaktadır. Örnek 2: function Urun(adi, fiyati) { this.adi = adi; this.fiyati = fiyati; } function Giyecek(adi, fiyati) { Urun.call(this, adi, fiyati); this.kategori = "Giyecek"; } function Yiyecek(adi, fiyati) { Urun.call(this, adi, fiyati); this.kategori = "Yiyecek"; } var elma = new Yiyecek("Elma", 4); var pantolon = new Giyecek("Pantolon", 44); Bu örnekte  Urun   fonksiyonu, ortak özellikleri olan sınıflar için bu özelliklerle sınırlı olmak şartıyla bir ortak yapılandırıcı olarak kullanılıyor. Bir nesne içinde tanımlanan fonksiyonu da  nesneAdi.fonksiyonAdi.call  şeklinde çağırabilirsiniz. call  metoduna gönderilen  thisParametresi  , eğer  null  veya  undefined  olursa global nesne ile (web sayfalarında  window  nesnesi) değiştirilir. Bu değer eğer temel tiplerden birisi olursa, örneğin bir sayı gönderirseniz, gönderilen değer nesneye dönüştürülür. Function.prototype.apply Metodu: Bu metot  call  ile aynı işi yapar. Kullanımı: apply(thisParametresi[,parametreDizisi]); Görüldüğü gibi  call  ile aralarındaki fark parametrelerin bir dizi olarak gönderilmesidir. Bu,  Function.arguments  özelliği ve  JavaScript Fonksiyonlari: arguments Nesnesi   makalemizde açıkladığımı arguments değişkeni ile beraber kullanıldığında kolaylık sağlar. Birinci  call  örneğini  apply  ile yapalım: function tamAdOlustur(adVeSoyadDizisi) { this.tamAdi = adVeSoyadDizisi[0] + " " + adVeSoyadDizisi[1]; } function Kisi(adi, soyadi) { this.adi = adi; this.soyadi = soyadi; tamAdOlustur.apply(this, [adi, soyadi]); } var ogretmen = new Kisi("Ahmet", "Geçe"); console.log(ogretmen.tamAdi); Çıktısı: Ahmet Geçe İsimsiz bir fonksiyonu  call  veya  apply  ile çağırmak isterseniz fonksiyonu parantez içine alın. Örnek: (function(a, b) { return a * b; }).call(this, 3, 5); Function.prototype.bind Metodu: bind  metodu, çağırıldığında, fonksiyonun içinde kullanılacak  this  değeri belirtilen bir nesne veya fonksiyon kapsamı olan bir  fonksiyon döndürür . Daha sonra bu dönen fonksiyonu kullanarak fonksiyonu istediğimiz nesnenin veya fonksiyonun kapsamında çalıştırabiliriz. Yeni fonksiyon içinde kullanılan  this , bizim belirttiğimiz nesne veya fonksiyon kapsamına işaret eder. Kullanımı: bind(thisParametresi[,Parametre1[,Parametre2,[...]]]); Bu metodun kullanımı görüldüğü gibi  call  metodu ile aynı,  apply  metodu ile benzerdir ( apply 'de  thisParametresi  zorunlu değil).  bind  metodunun  call   ve  apply 'den farkı bir fonksiyon döndürmesidir.  call  ve  apply  ise fonksiyonu çalıştırırlar. Örnek: var genislik = 10; var sekil = { genislik: 3, genislikYaz: function () { console.log(this.genislik) } } sekil.genislikYaz(); // 3 yazar var genislikYazFonksiyonu = sekil.genislikYaz; genislikYazFonksiyonu(); // 10 yazar genislikYazFonksiyonu = sekil.genislikYaz.bind(sekil); genislikYazFonksiyonu(); // 3 yazar Çıktısı: 3 10 3 Örnekte nesne dışında tanımlanan  genislik  değişkeni ( var genislik = 10  satırı) global nesne olan  window  nesnesinin bir özellik / değişken değeri olacaktır. Bir nesne veya yapılandırıcı bir fonksiyon içinde kullanılmayan  this ,  window  nesnesini işaret eder. Bu şekilde  console.log(this.genislik)   yazmak window nesnesine bağladığımız  genislik  değişkeninin değerini yazacaktır. sekil   nesnesinin  genislikYaz   yöntemi çağırıldığında ( sekil.genislikYaz()    şeklinde)   console.log(this.genislik)   ifadesi, sekil nesnesinin  genislik   değerini yani 3 değerini yazmaktadır. Ancak  sekil.genislikYaz   fonksiyonunu bir değişkene atayıp çalıştırdığımızda sadece fonksiyonu atamış olduğumuzdan, bu değişken aracılığıyla fonksiyon çalıştırıldığında (ilk  genislikYazFonksiyonu()   ifadesi) fonksiyon içindeki  this  ,  window   nesnesine işaret edeceğinden 10 değerini yazmaktadır. İşte bu durumda nesne içindeki fonksiyonun referansını almak yerine,  bind  metoduyla  thisParametresi  olarak sekil nesnesini gönderip fonksiyonun bir kopyasını alarak çalıştırdığımızda fonksiyon içindeki  this  sekil nesnesine işaret etmekte ve 3 sonucunu almaktayız. bind  metoduna  thisParametresi  haricinde gönderilen parametre değerleri, dönen fonksiyonda sabitlenir ve atadığımız değişken vasıtasıyla fonksiyonu çağırdığımızda her zaman bu parametreler  bind  sırasında belirtiğimiz değerlere sahip olacaktır. Fonksiyonu, atandığı değişkeni kullanarak çağırırken  bind  sırasında bildirilmeyen parametreleri kullanabiliriz. Örnek: function parametreleriYaz(a, b, c, d) { console.log(a, b, c, d); } var parametreleriYazan = parametreleriYaz.bind(window, 1, 2); parametreleriYazan(3, 4); Çıktısı: 1 2 3 4 Görüldüğü gibi  bind  sırasında verilen 1 ve 2 parametrelerini  parametreleriYazan  değişkeni vasıtasıyla fonksiyonu çağırdığımızda belirtmedik. Diğer parametreleri bildirdik.  bind  ile dönen fonksiyonda,  bind  ile verilen parametre değerleri sabit olarak kabul edilir ve bu fonksiyonu sonradan çağırdığımızda varsayılan değer olarak kalıyorlar. Fonksiyonu çağırdığımızda verilen parametreler, bu parametrelerden sonraki parametreler olarak kabul edilir. Function.prototype.isGenerator Metodu: (Bu metod henüz standart olmamıştır.) isGenerator  metodu, fonksiyonun bir üretici fonksiyon (generator function, * ile tanımlanmış, yield kullanan fonksiyonlar) olup olmadığını test etmek için kullanılır. Üretici fonksiyonlar ileride açıklanacaktır. Function.prototype.toSource Metodu: (Bu metod henüz standart olmamıştır.) toSource  metodu, bir nesnenin kaynak kodunu  string   olarak döndürür. Fonksiyonlar da birer nesne olduğundan bu metot ile fonksiyonun kaynak kodunu  string  olarak elde edebiliriz. Ancak yerleşik fonksiyonlarda fonksiyonunun yerleşik kod (native code) olduğunu bildiren bir  string  alırız. Örnek: function deneme(a, b) { console.log(a, b); } var nesne = { x: 10, yaz: function() { console.log(this.x) } }; console.log(deneme.toSource()); console.log(nesne.toSource()); console.log(String.split.toSource()); // String.split yerleşik bir fonksiyondur. Çıktısı: function deneme(a, b) {             console.log(a, b);         } ({x:10, yaz:(function () { console.log(this.x) })}) function split() {     [native code] } Function.prototype.toString Metodu: toString  metodu, nesnelerin  string  bir ifadesini verir. Eğer kullanılan nesne kendi tanımladığımız bir fonksiyon ise kaynağını  string  olarak alırız. Ancak yerleşik JavaScript fonksiyonları ve nesneler için fonksiyonun yerel kod olduğunu veya nesnenin tipini bildiren bir ifade ile karşılaşırız. Bu metodu fonksiyonun  string  halini almak için kullanabiliriz. Örnek: function deneme(a, b) { console.log(a, b); } var nesne = { x: 10, yaz: function() { console.log(this.x) }; }; console.log(deneme.toString()); console.log(nesne.toString()); console.log(String.split.toString()); // String.split yerleşik bir fonksiyondur. Çıktısı: function deneme(a, b) {             console.log(a, b);         } [object Object] function split() {     [native code] } JavaScript Fonksiyonları ile İlgili Makaleler: JavaScript Fonksiyonları: Temel Kullanım JavaScript Fonksiyonları: Fonksiyonun Kendini Çağırması (Recursion) JavaScript Foksiyonları: Fonksiyon İfadeler - Function Expressions JavaScript Fonksiyonları: Kapsanımlar - Closures Javascript Fonksiyonları: Yerinde Çalıştırılan İsimsiz Fonksiyonlar JavaScript Fonksiyonları: Nesne İçinde Fonksiyon - Metotlar JavaScript Fonksiyonları: Nesne Yapılandırıcısı Olarak Fonksiyon Kullanma JavaScript Fonksiyonları: this Kullanımı JavaScript Fonksiyonlari: arguments Nesnesi JavaScript Fonksiyonları: rest Parametreleri JavaScript Fonksiyonları: Function Yapılandırıcısı  (Bu makale) JavaScript Fonksiyonları: getter ve setter Fonksiyonlar JavaScript Fonksiyonları: Arrow (ok) Fonksiyonları JavaScript Fonksiyonları: Üretici Fonksiyonlar - Generator Functions
Ekleyen: canora
Değiştiren: cevapsitesi
27.06.16 00:48
JavaScript Fonksiyonları: Function Yapılandırıcısı
Daha önceki makalelerimizde de belirttiğimiz gibi  fonksiyonlar birer nesnedir ve bundan dolayı her fonksiyon bir değer olarak kullanılabilir. Fonksiyon nesneleri  Function  nesnesinden türetilir. Yani  function  ile bir tanımlama yaptığınızda oluşturulan şey  Function  nesnesinin bir örneğidir, dolayısıyla bir nesne / değerdir. Function  yapılandırıcısını kullanarak biz de fonksiyonlar oluşturabiliriz. Kullanımı: new Function([[Parametre1,[Parametre2,[...]]],[Fonksiyon Gövdesi]]); Kullanımdan anlaşılacağı gibi ilk parametreler eğer varsa fonksiyonun parametrelerinin adlarını tanımlıyor. Son kullanılan parametre ise fonksiyonun gövdesini  string  olarak bildirmek için kullanılıyor. Tabi parametreler yoksa doğrudan fonksiyon gövdesini tek parametre olarak yazabilirsiniz. Veya hiç parametre veya fonksiyon gövdesi kullanmadan da tanımlayabilirsiniz. Parametreli örnek: var toplama = new Function("sayi1", "sayi2", "return sayi1 + sayi2;"); console.log(toplama(3, 5)); Çıktısı: 8 Bu örnekte tanımlanan fonksiyon şununla aynıdır: function toplama(sayi1, sayi2) { return sayi1 + sayi2; } console.log(toplama(3, 5)); Parametresiz örnek: var mesajYaz = new Function("console.log('Merhaba.');"); mesajYaz(); Çıktısı: Merhaba. Bu örnekte tanımlanan fonksiyon şununla aynıdır: function mesajYaz() { console.log("Merhaba."); } mesajYaz() Function Nesnesinin Özellik ve Metotları Function nesnesi bazı yararlı özellik ve metotlara sahiptir. Bir fonksiyonu fonksiyon bildirimi veya fonksiyon ifadesi olarak tanımladığınızda da bu özellik ve metotları kullanabilirsiniz. Function.arguments Özelliği: (Bu özellik eskimiş bir özelliktir. Bunun yerine  JavaScript Fonksiyonlari: arguments Nesnesi  makalemizde açıklanan arguments değişkenini kullanın. Ancak yine de bir çok tarayıcıda çalışır.) Function.arguments   özelliği, fonksiyona gelen parametreleri tutan dizi şeklinde bir değerdir. Örnek: function deneme(a, b) { console.log(deneme.arguments[0]); console.log(deneme.arguments[1]); console.log(deneme.arguments[2]); } deneme(1, 2); Çıktısı: 1 2 undefined Örnekte fonksiyona 3. parametre gönderilmediğinden   arguments[2]   ,  undefined   olmuştur. Function.caller Özelliği: (Bu özellik standart değildir ve standarda eklenecek özellikler listesinde de yer almamaktadır.) caller  özelliği fonksiyonu çağıran fonksiyonun referansını döndürür. Örnek: function deneme2() { console.log(deneme2.caller); } function deneme() { console.log(deneme.caller); deneme2(); } deneme(); Çıktısı: null deneme() Örnekte  deneme  fonksiyonu çağırılıyor, bu fonksiyon içinden de  deneme2  fonksiyonu çağırılıyor. Her iki fonksiyon içinden de kendilerini çağıran fonksiyonları çıktıya yazmaları isteniyor. Çıktıda görüldüğü gibi  deneme  fonksiyonu herhangi bir fonksiyon içinden çağırılmadığı için  caller ,  null  döndürülüyor. Bazı tarayıcılarda  deneme()  şeklinde bir çıktı yerine yerine fonksiyonun tamamını da görebilirsiniz. Function.length Özelliği: Bu özellik, fonksiyona gelmesi beklenen / fonksiyon tanımında belirtilen özellik sayısını döndürür. Örnek: function deneme(a, b, c) { console.log(deneme.length); } deneme(1, 2); Çıktısı: 3 Örnekte görüldüğü gibi beklenen / bildirilen parametre sayısı veriliyor. Gönderilen parametre sayısı değil. Function.displayName Özelliği: (Bu özellik standart değildir ve standarda eklenecek özellikler listesinde de yer almamaktadır.) Bu özellik bir fonksiyona atandığında, konsol veya JavaScript durum izlemelerinde (profiler) fonksiyon bu isimle gösterilir. Örnek: function deneme() { console.log(deneme.displayName); } deneme() deneme.displayName = "Deneme Fonksiyonu"; deneme(); Çıktısı: undefined Deneme Fonksiyonu Function.name Özelliği: Referansı verilen fonksiyonun adını döndürür. Örnek: function deneme() { } // Bir fonksiyon bildirimi var f = function () { }; // Bir fonksiyon ifadesi (anonim, isimsiz) var testF = function test() { }; // İsimli bir fonksiyon ifadesi var nesne = { birFonksiyon: function () { } // Bir nesne içinde fonksiyon ifadesi. , baskaFonksiyon: function baska() { } // Bir nesne içinde isimli fonksiyon ifadesi. } console.log(deneme.name); console.log(f.name); console.log(testF.name); console.log(nesne.birFonksiyon.name); console.log(nesne.baskaFonksiyon.name); Çıktısı: deneme (an empty string) test (an empty string) baska Görüldüğü gibi bir nesne içinde veya dışında tanımlanmış fonksiyon ifadelerinde eğer isim tanımlanmışsa (örnekte test) isim döndürülüyor, aksi halde boş bir string döndürüyor. ((an empty string) ifadesi, Firefox hata ayıklayıcıda çıktının boş bir metin olduğunu bildiriyor.) Eğer Edge tarayıcısında aynı örneği denerseniz, çıktı: deneme test birFonksiyon baska şeklinde olacaktır (deneme metninden sonra bir boş satır var). Function.prototype.call Metodu: Bu yöntem, bir fonksiyonu çalıştırmak için kullanılır. Kullanımı: call(thisParametresi[,Parametre1[,Parametre2,[...]]]); Bu kullanımdaki  thisParametresi  ile belirtilen ilk parametre, bir nesnenin kapsamını çağırılan fonksiyona geçirmek için kullanılır. Sonraki parametreler, fonksiyona gönderilecek parametrelerdir. Örnek: function tamAdOlustur(adi, soyadi) { this.tamAdi = adi + " " + soyadi; } function Kisi(adi, soyadi) { this.adi = adi; this.soyadi = soyadi; tamAdOlustur.call(this, adi, soyadi); } var ogretmen = new Kisi("Ahmet", "Geçe"); console.log(ogretmen.tamAdi); Çıktısı: Ahmet Geçe Örnekte  Kisi  isimli yapılandırıcı fonksiyon içinden çağırılan  tamAdOlustur  fonksiyonu doğrudan değil  call  metodu ile çağırılmıştır.  call  yönteminde gönderilen ilk parametre olan  this , oluşturulan örneğin kapsamını  tamAdOlustur  fonksiyona geçmektedir. Bundan dolayı  tamAdOlustur  fonksiyonunun içinde sanki  Kisi  fonksiyonunun içindeymiş gibi  this  kullanılabilmekte ve oluşturulan örneğin (nesnenin)  tamAdi  özelliğine bir değer atanmaktadır. Örnek 2: function Urun(adi, fiyati) { this.adi = adi; this.fiyati = fiyati; } function Giyecek(adi, fiyati) { Urun.call(this, adi, fiyati); this.kategori = "Giyecek"; } function Yiyecek(adi, fiyati) { Urun.call(this, adi, fiyati); this.kategori = "Yiyecek"; } var elma = new Yiyecek("Elma", 4); var pantolon = new Giyecek("Pantolon", 44); Bu örnekte  Urun   fonksiyonu, ortak özellikleri olan sınıflar için bu özelliklerle sınırlı olmak şartıyla bir ortak yapılandırıcı olarak kullanılıyor. Bir nesne içinde tanımlanan fonksiyonu da  nesneAdi.fonksiyonAdi.call  şeklinde çağırabilirsiniz. call  metoduna gönderilen  thisParametresi  , eğer  null  veya  undefined  olursa global nesne ile (web sayfalarında  window  nesnesi) değiştirilir. Bu değer eğer temel tiplerden birisi olursa, örneğin bir sayı gönderirseniz, gönderilen değer nesneye dönüştürülür. Function.prototype.apply Metodu: Bu metot  call  ile aynı işi yapar. Kullanımı: apply(thisParametresi[,parametreDizisi]); Görüldüğü gibi  call  ile aralarındaki fark parametrelerin bir dizi olarak gönderilmesidir. Bu,  Function.arguments  özelliği ve  JavaScript Fonksiyonlari: arguments Nesnesi   makalemizde açıkladığımı arguments değişkeni ile beraber kullanıldığında kolaylık sağlar. Birinci  call  örneğini  apply  ile yapalım: function tamAdOlustur(adVeSoyadDizisi) { this.tamAdi = adVeSoyadDizisi[0] + " " + adVeSoyadDizisi[1]; } function Kisi(adi, soyadi) { this.adi = adi; this.soyadi = soyadi; tamAdOlustur.apply(this, [adi, soyadi]); } var ogretmen = new Kisi("Ahmet", "Geçe"); console.log(ogretmen.tamAdi); Çıktısı: Ahmet Geçe İsimsiz bir fonksiyonu  call  veya  apply  ile çağırmak isterseniz fonksiyonu parantez içine alın. Örnek: (function(a, b) { return a * b; }).call(this, 3, 5); Function.prototype.bind Metodu: bind  metodu, çağırıldığında, fonksiyonun içinde kullanılacak  this  değeri belirtilen bir nesne veya fonksiyon kapsamı olan bir  fonksiyon döndürür . Daha sonra bu dönen fonksiyonu kullanarak fonksiyonu istediğimiz nesnenin veya fonksiyonun kapsamında çalıştırabiliriz. Yeni fonksiyon içinde kullanılan  this , bizim belirttiğimiz nesne veya fonksiyon kapsamına işaret eder. Kullanımı: bind(thisParametresi[,Parametre1[,Parametre2,[...]]]); Bu metodun kullanımı görüldüğü gibi  call  metodu ile aynı,  apply  metodu ile benzerdir ( apply 'de  thisParametresi  zorunlu değil).  bind  metodunun  call   ve  apply 'den farkı bir fonksiyon döndürmesidir.  call  ve  apply  ise fonksiyonu çalıştırırlar. Örnek: var genislik = 10; var sekil = { genislik: 3, genislikYaz: function () { console.log(this.genislik) } } sekil.genislikYaz(); // 3 yazar var genislikYazFonksiyonu = sekil.genislikYaz; genislikYazFonksiyonu(); // 10 yazar genislikYazFonksiyonu = sekil.genislikYaz.bind(sekil); genislikYazFonksiyonu(); // 3 yazar Çıktısı: 3 10 3 Örnekte nesne dışında tanımlanan  genislik  değişkeni ( var genislik = 10  satırı) global nesne olan  window  nesnesinin bir özellik / değişken değeri olacaktır. Bir nesne veya yapılandırıcı bir fonksiyon içinde kullanılmayan  this ,  window  nesnesini işaret eder. Bu şekilde  console.log(this.genislik)   yazmak window nesnesine bağladığımız  genislik  değişkeninin değerini yazacaktır. sekil   nesnesinin  genislikYaz   yöntemi çağırıldığında ( sekil.genislikYaz()    şeklinde)   console.log(this.genislik)   ifadesi, sekil nesnesinin  genislik   değerini yani 3 değerini yazmaktadır. Ancak  sekil.genislikYaz   fonksiyonunu bir değişkene atayıp çalıştırdığımızda sadece fonksiyonu atamış olduğumuzdan, bu değişken aracılığıyla fonksiyon çalıştırıldığında (ilk  genislikYazFonksiyonu()   ifadesi) fonksiyon içindeki  this  ,  window   nesnesine işaret edeceğinden 10 değerini yazmaktadır. İşte bu durumda nesne içindeki fonksiyonun referansını almak yerine,  bind  metoduyla  thisParametresi  olarak sekil nesnesini gönderip fonksiyonun bir kopyasını alarak çalıştırdığımızda fonksiyon içindeki  this  sekil nesnesine işaret etmekte ve 3 sonucunu almaktayız. bind  metoduna  thisParametresi  haricinde gönderilen parametre değerleri, dönen fonksiyonda sabitlenir ve atadığımız değişken vasıtasıyla fonksiyonu çağırdığımızda her zaman bu parametreler  bind  sırasında belirtiğimiz değerlere sahip olacaktır. Fonksiyonu, atandığı değişkeni kullanarak çağırırken  bind  sırasında bildirilmeyen parametreleri kullanabiliriz. Örnek: function parametreleriYaz(a, b, c, d) { console.log(a, b, c, d); } var parametreleriYazan = parametreleriYaz.bind(window, 1, 2); parametreleriYazan(3, 4); Çıktısı: 1 2 3 4 Görüldüğü gibi  bind  sırasında verilen 1 ve 2 parametrelerini  parametreleriYazan  değişkeni vasıtasıyla fonksiyonu çağırdığımızda belirtmedik. Diğer parametreleri bildirdik.  bind  ile dönen fonksiyonda,  bind  ile verilen parametre değerleri sabit olarak kabul edilir ve bu fonksiyonu sonradan çağırdığımızda varsayılan değer olarak kalıyorlar. Fonksiyonu çağırdığımızda verilen parametreler, bu parametrelerden sonraki parametreler olarak kabul edilir. Function.prototype.isGenerator Metodu: (Bu metod henüz standart olmamıştır.) isGenerator  metodu, fonksiyonun bir üretici fonksiyon (generator function, * ile tanımlanmış, yield kullanan fonksiyonlar) olup olmadığını test etmek için kullanılır. Üretici fonksiyonlar ileride açıklanacaktır. Function.prototype.toSource Metodu: (Bu metod henüz standart olmamıştır.) toSource  metodu, bir nesnenin kaynak kodunu  string   olarak döndürür. Fonksiyonlar da birer nesne olduğundan bu metot ile fonksiyonun kaynak kodunu  string  olarak elde edebiliriz. Ancak yerleşik fonksiyonlarda fonksiyonunun yerleşik kod (native code) olduğunu bildiren bir  string  alırız. Örnek: function deneme(a, b) { console.log(a, b); } var nesne = { x: 10, yaz: function() { console.log(this.x) } }; console.log(deneme.toSource()); console.log(nesne.toSource()); console.log(String.split.toSource()); // String.split yerleşik bir fonksiyondur. Çıktısı: function deneme(a, b) {             console.log(a, b);         } ({x:10, yaz:(function () { console.log(this.x) })}) function split() {     [native code] } Function.prototype.toString Metodu: toString  metodu, nesnelerin  string  bir ifadesini verir. Eğer kullanılan nesne kendi tanımladığımız bir fonksiyon ise kaynağını  string  olarak alırız. Ancak yerleşik JavaScript fonksiyonları ve nesneler için fonksiyonun yerel kod olduğunu veya nesnenin tipini bildiren bir ifade ile karşılaşırız. Bu metodu fonksiyonun  string  halini almak için kullanabiliriz. Örnek: function deneme(a, b) { console.log(a, b); } var nesne = { x: 10, yaz: function() { console.log(this.x) }; }; console.log(deneme.toString()); console.log(nesne.toString()); console.log(String.split.toString()); // String.split yerleşik bir fonksiyondur. Çıktısı: function deneme(a, b) {             console.log(a, b);         } [object Object] function split() {     [native code] } JavaScript Fonksiyonları ile İlgili Makaleler: JavaScript Fonksiyonları: Temel Kullanım JavaScript Fonksiyonları: Fonksiyonun Kendini Çağırması (Recursion) JavaScript Foksiyonları: Fonksiyon İfadeler - Function Expressions JavaScript Fonksiyonları: Kapsanımlar - Closures Javascript Fonksiyonları: Yerinde Çalıştırılan İsimsiz Fonksiyonlar JavaScript Fonksiyonları: Nesne İçinde Fonksiyon - Metotlar JavaScript Fonksiyonları: Nesne Yapılandırıcısı Olarak Fonksiyon Kullanma JavaScript Fonksiyonları: this Kullanımı JavaScript Fonksiyonlari: arguments Nesnesi JavaScript Fonksiyonları: rest Parametreleri JavaScript Fonksiyonları: Function Yapılandırıcısı  (Bu makale) JavaScript Fonksiyonları: getter ve setter Fonksiyonlar JavaScript Fonksiyonları: Arrow (ok) Fonksiyonları JavaScript Fonksiyonları: Üretici Fonksiyonlar - Generator Functions
Ekleyen: canora
Değiştiren: canora
27.06.16 00:46
JavaScript Fonksiyonları: Function Yapılandırıcısı
Daha önceki makalelerimizde de belirttiğimiz gibi  fonksiyonlar birer nesnedir ve bundan dolayı her fonksiyon bir değer olarak kullanılabilir. Fonksiyon nesneleri  Function  nesnesinden türetilir. Yani  function  ile bir tanımlama yaptığınızda oluşturulan şey  Function  sınıfının bir örneğidir, dolayısıyla bir nesne / değerdir. Function  nesnesini kullanarak biz de fonksiyonlar oluşturabiliriz. Kullanımı: new Function([[Parametre1,[Parametre2,[...]]],[Fonksiyon Gövdesi]]); Kullanımdan anlaşılacağı gibi ilk parametreler eğer varsa fonksiyonun parametrelerinin adlarını tanımlıyor. Son kullanılan parametre ise fonksiyonun gövdesini  string  olarak bildirmek için kullanılıyor. Tabi parametreler yoksa doğrudan fonksiyon gövdesini tek parametre olarak yazabilirsiniz. Veya hiç parametre veya fonksiyon gövdesi kullanmadan da tanımlayabilirsiniz. Parametreli örnek: var toplama = new Function("sayi1", "sayi2", "return sayi1 + sayi2;"); console.log(toplama(3, 5)); Çıktısı: 8 Bu örnekte tanımlanan fonksiyon şununla aynıdır: function toplama(sayi1, sayi2) { return sayi1 + sayi2; } console.log(toplama(3, 5)); Parametresiz örnek: var mesajYaz = new Function("console.log('Merhaba.');"); mesajYaz(); Çıktısı: Merhaba. Bu örnekte tanımlanan fonksiyon şununla aynıdır: function mesajYaz() { console.log("Merhaba."); } mesajYaz() Function Nesnesinin Özellik ve Metotları Function nesnesi bazı yararlı özellik ve metotlara sahiptir. Bir fonksiyonu fonksiyon bildirimi veya fonksiyon ifadesi olarak tanımladığınızda da bu özellik ve metotları kullanabilirsiniz. Function.arguments Özelliği: (Bu özellik eskimiş bir özelliktir. Bunun yerine  JavaScript Fonksiyonlari: arguments Nesnesi  makalemizde açıklanan arguments değişkenini kullanın. Ancak yine de bir çok tarayıcıda çalışır.) Function.arguments   özelliği, fonksiyona gelen parametreleri tutan dizi şeklinde bir değerdir. Örnek: function deneme(a, b) { console.log(deneme.arguments[0]); console.log(deneme.arguments[1]); console.log(deneme.arguments[2]); } deneme(1, 2); Çıktısı: 1 2 undefined Örnekte fonksiyona 3. parametre gönderilmediğinden   arguments[2]   ,  undefined   olmuştur. Function.caller Özelliği: (Bu özellik standart değildir ve standarda eklenecek özellikler listesinde de yer almamaktadır.) caller  özelliği fonksiyonu çağıran fonksiyonun referansını döndürür. Örnek: function deneme2() { console.log(deneme2.caller); } function deneme() { console.log(deneme.caller); deneme2(); } deneme(); Çıktısı: null deneme() Örnekte  deneme  fonksiyonu çağırılıyor, bu fonksiyon içinden de  deneme2  fonksiyonu çağırılıyor. Her iki fonksiyon içinden de kendilerini çağıran fonksiyonları çıktıya yazmaları isteniyor. Çıktıda görüldüğü gibi  deneme  fonksiyonu herhangi bir fonksiyon içinden çağırılmadığı için  caller ,  null  döndürülüyor. Bazı tarayıcılarda  deneme()  şeklinde bir çıktı yerine yerine fonksiyonun tamamını da görebilirsiniz. Function.length Özelliği: Bu özellik, fonksiyona gelmesi beklenen / fonksiyon tanımında belirtilen özellik sayısını döndürür. Örnek: function deneme(a, b, c) { console.log(deneme.length); } deneme(1, 2); Çıktısı: 3 Örnekte görüldüğü gibi beklenen / bildirilen parametre sayısı veriliyor. Gönderilen parametre sayısı değil. Function.displayName Özelliği: (Bu özellik standart değildir ve standarda eklenecek özellikler listesinde de yer almamaktadır.) Bu özellik bir fonksiyona atandığında, konsol veya JavaScript durum izlemelerinde (profiler) fonksiyon bu isimle gösterilir. Örnek: function deneme() { console.log(deneme.displayName); } deneme() deneme.displayName = "Deneme Fonksiyonu"; deneme(); Çıktısı: undefined Deneme Fonksiyonu Function.name Özelliği: Referansı verilen fonksiyonun adını döndürür. Örnek: function deneme() { } // Bir fonksiyon bildirimi var f = function () { }; // Bir fonksiyon ifadesi (anonim, isimsiz) var testF = function test() { }; // İsimli bir fonksiyon ifadesi var nesne = { birFonksiyon: function () { } // Bir nesne içinde fonksiyon ifadesi. , baskaFonksiyon: function baska() { } // Bir nesne içinde isimli fonksiyon ifadesi. } console.log(deneme.name); console.log(f.name); console.log(testF.name); console.log(nesne.birFonksiyon.name); console.log(nesne.baskaFonksiyon.name); Çıktısı: deneme (an empty string) test (an empty string) baska Görüldüğü gibi bir nesne içinde veya dışında tanımlanmış fonksiyon ifadelerinde eğer isim tanımlanmışsa (örnekte test) isim döndürülüyor, aksi halde boş bir string döndürüyor. ((an empty string) ifadesi, Firefox hata ayıklayıcıda çıktının boş bir metin olduğunu bildiriyor.) Eğer Edge tarayıcısında aynı örneği denerseniz, çıktı: deneme test birFonksiyon baska şeklinde olacaktır (deneme metninden sonra bir boş satır var). Function.prototype.call Metodu: Bu yöntem, bir fonksiyonu çalıştırmak için kullanılır. Kullanımı: call(thisParametresi[,Parametre1[,Parametre2,[...]]]); Bu kullanımdaki  thisParametresi  ile belirtilen ilk parametre, bir nesnenin kapsamını çağırılan fonksiyona geçirmek için kullanılır. Sonraki parametreler, fonksiyona gönderilecek parametrelerdir. Örnek: function tamAdOlustur(adi, soyadi) { this.tamAdi = adi + " " + soyadi; } function Kisi(adi, soyadi) { this.adi = adi; this.soyadi = soyadi; tamAdOlustur.call(this, adi, soyadi); } var ogretmen = new Kisi("Ahmet", "Geçe"); console.log(ogretmen.tamAdi); Çıktısı: Ahmet Geçe Örnekte  Kisi  isimli yapılandırıcı fonksiyon içinden çağırılan  tamAdOlustur  fonksiyonu doğrudan değil  call  metodu ile çağırılmıştır.  call  yönteminde gönderilen ilk parametre olan  this , oluşturulan örneğin kapsamını  tamAdOlustur  fonksiyona geçmektedir. Bundan dolayı  tamAdOlustur  fonksiyonunun içinde sanki  Kisi  fonksiyonunun içindeymiş gibi  this  kullanılabilmekte ve oluşturulan örneğin (nesnenin)  tamAdi  özelliğine bir değer atanmaktadır. Örnek 2: function Urun(adi, fiyati) { this.adi = adi; this.fiyati = fiyati; } function Giyecek(adi, fiyati) { Urun.call(this, adi, fiyati); this.kategori = "Giyecek"; } function Yiyecek(adi, fiyati) { Urun.call(this, adi, fiyati); this.kategori = "Yiyecek"; } var elma = new Yiyecek("Elma", 4); var pantolon = new Giyecek("Pantolon", 44); Bu örnekte  Urun   fonksiyonu, ortak özellikleri olan sınıflar için bu özelliklerle sınırlı olmak şartıyla bir ortak yapılandırıcı olarak kullanılıyor. Bir nesne içinde tanımlanan fonksiyonu da  nesneAdi.fonksiyonAdi.call  şeklinde çağırabilirsiniz. call  metoduna gönderilen  thisParametresi  , eğer  null  veya  undefined  olursa global nesne ile (web sayfalarında  window  nesnesi) değiştirilir. Bu değer eğer temel tiplerden birisi olursa, örneğin bir sayı gönderirseniz, gönderilen değer nesneye dönüştürülür. Function.prototype.apply Metodu: Bu metot  call  ile aynı işi yapar. Kullanımı: apply(thisParametresi[,parametreDizisi]); Görüldüğü gibi  call  ile aralarındaki fark parametrelerin bir dizi olarak gönderilmesidir. Bu,  Function.arguments  özelliği ve  JavaScript Fonksiyonlari: arguments Nesnesi   makalemizde açıkladığımı arguments değişkeni ile beraber kullanıldığında kolaylık sağlar. Birinci  call  örneğini  apply  ile yapalım: function tamAdOlustur(adVeSoyadDizisi) { this.tamAdi = adVeSoyadDizisi[0] + " " + adVeSoyadDizisi[1]; } function Kisi(adi, soyadi) { this.adi = adi; this.soyadi = soyadi; tamAdOlustur.apply(this, [adi, soyadi]); } var ogretmen = new Kisi("Ahmet", "Geçe"); console.log(ogretmen.tamAdi); Çıktısı: Ahmet Geçe İsimsiz bir fonksiyonu  call  veya  apply  ile çağırmak isterseniz fonksiyonu parantez içine alın. Örnek: (function(a, b) { return a * b; }).call(this, 3, 5); Function.prototype.bind Metodu: bind  metodu, çağırıldığında, fonksiyonun içinde kullanılacak  this  değeri belirtilen bir nesne veya fonksiyon kapsamı olan bir  fonksiyon döndürür . Daha sonra bu dönen fonksiyonu kullanarak fonksiyonu istediğimiz nesnenin veya fonksiyonun kapsamında çalıştırabiliriz. Yeni fonksiyon içinde kullanılan  this , bizim belirttiğimiz nesne veya fonksiyon kapsamına işaret eder. Kullanımı: bind(thisParametresi[,Parametre1[,Parametre2,[...]]]); Bu metodun kullanımı görüldüğü gibi  call  metodu ile aynı,  apply  metodu ile benzerdir ( apply 'de  thisParametresi  zorunlu değil).  bind  metodunun  call   ve  apply 'den farkı bir fonksiyon döndürmesidir.  call  ve  apply  ise fonksiyonu çalıştırırlar. Örnek: var genislik = 10; var sekil = { genislik: 3, genislikYaz: function () { console.log(this.genislik) } } sekil.genislikYaz(); // 3 yazar var genislikYazFonksiyonu = sekil.genislikYaz; genislikYazFonksiyonu(); // 10 yazar genislikYazFonksiyonu = sekil.genislikYaz.bind(sekil); genislikYazFonksiyonu(); // 3 yazar Çıktısı: 3 10 3 Örnekte nesne dışında tanımlanan  genislik  değişkeni ( var genislik = 10  satırı) global nesne olan  window  nesnesinin bir özellik / değişken değeri olacaktır. Bir nesne veya yapılandırıcı bir fonksiyon içinde kullanılmayan  this ,  window  nesnesini işaret eder. Bu şekilde  console.log(this.genislik)   yazmak window nesnesine bağladığımız  genislik  değişkeninin değerini yazacaktır. sekil   nesnesinin  genislikYaz   yöntemi çağırıldığında ( sekil.genislikYaz()    şeklinde)   console.log(this.genislik)   ifadesi, sekil nesnesinin  genislik   değerini yani 3 değerini yazmaktadır. Ancak  sekil.genislikYaz   fonksiyonunu bir değişkene atayıp çalıştırdığımızda sadece fonksiyonu atamış olduğumuzdan, bu değişken aracılığıyla fonksiyon çalıştırıldığında (ilk  genislikYazFonksiyonu()   ifadesi) fonksiyon içindeki  this  ,  window   nesnesine işaret edeceğinden 10 değerini yazmaktadır. İşte bu durumda nesne içindeki fonksiyonun referansını almak yerine,  bind  metoduyla  thisParametresi  olarak sekil nesnesini gönderip fonksiyonun bir kopyasını alarak çalıştırdığımızda fonksiyon içindeki  this  sekil nesnesine işaret etmekte ve 3 sonucunu almaktayız. bind  metoduna  thisParametresi  haricinde gönderilen parametre değerleri, dönen fonksiyonda sabitlenir ve atadığımız değişken vasıtasıyla fonksiyonu çağırdığımızda her zaman bu parametreler  bind  sırasında belirtiğimiz değerlere sahip olacaktır. Fonksiyonu, atandığı değişkeni kullanarak çağırırken  bind  sırasında bildirilmeyen parametreleri kullanabiliriz. Örnek: function parametreleriYaz(a, b, c, d) { console.log(a, b, c, d); } var parametreleriYazan = parametreleriYaz.bind(window, 1, 2); parametreleriYazan(3, 4); Çıktısı: 1 2 3 4 Görüldüğü gibi  bind  sırasında verilen 1 ve 2 parametrelerini  parametreleriYazan  değişkeni vasıtasıyla fonksiyonu çağırdığımızda belirtmedik. Diğer parametreleri bildirdik.  bind  ile dönen fonksiyonda,  bind  ile verilen parametre değerleri sabit olarak kabul edilir ve bu fonksiyonu sonradan çağırdığımızda varsayılan değer olarak kalıyorlar. Fonksiyonu çağırdığımızda verilen parametreler, bu parametrelerden sonraki parametreler olarak kabul edilir. Function.prototype.isGenerator Metodu: (Bu metod henüz standart olmamıştır.) isGenerator  metodu, fonksiyonun bir üretici fonksiyon (generator function, * ile tanımlanmış, yield kullanan fonksiyonlar) olup olmadığını test etmek için kullanılır. Üretici fonksiyonlar ileride açıklanacaktır. Function.prototype.toSource Metodu: (Bu metod henüz standart olmamıştır.) toSource  metodu, bir nesnenin kaynak kodunu  string   olarak döndürür. Fonksiyonlar da birer nesne olduğundan bu metot ile fonksiyonun kaynak kodunu  string  olarak elde edebiliriz. Ancak yerleşik fonksiyonlarda fonksiyonunun yerleşik kod (native code) olduğunu bildiren bir  string  alırız. Örnek: function deneme(a, b) { console.log(a, b); } var nesne = { x: 10, yaz: function() { console.log(this.x) } }; console.log(deneme.toSource()); console.log(nesne.toSource()); console.log(String.split.toSource()); // String.split yerleşik bir fonksiyondur. Çıktısı: function deneme(a, b) {             console.log(a, b);         } ({x:10, yaz:(function () { console.log(this.x) })}) function split() {     [native code] } Function.prototype.toString Metodu: toString  metodu, nesnelerin  string  bir ifadesini verir. Eğer kullanılan nesne kendi tanımladığımız bir fonksiyon ise kaynağını  string  olarak alırız. Ancak yerleşik JavaScript fonksiyonları ve nesneler için fonksiyonun yerel kod olduğunu veya nesnenin tipini bildiren bir ifade ile karşılaşırız. Bu metodu fonksiyonun  string  halini almak için kullanabiliriz. Örnek: function deneme(a, b) { console.log(a, b); } var nesne = { x: 10, yaz: function() { console.log(this.x) }; }; console.log(deneme.toString()); console.log(nesne.toString()); console.log(String.split.toString()); // String.split yerleşik bir fonksiyondur. Çıktısı: function deneme(a, b) {             console.log(a, b);         } [object Object] function split() {     [native code] } JavaScript Fonksiyonları ile İlgili Makaleler: JavaScript Fonksiyonları: Temel Kullanım JavaScript Fonksiyonları: Fonksiyonun Kendini Çağırması (Recursion) JavaScript Foksiyonları: Fonksiyon İfadeler - Function Expressions JavaScript Fonksiyonları: Kapsanımlar - Closures Javascript Fonksiyonları: Yerinde Çalıştırılan İsimsiz Fonksiyonlar JavaScript Fonksiyonları: Nesne İçinde Fonksiyon - Metotlar JavaScript Fonksiyonları: Nesne Yapılandırıcısı Olarak Fonksiyon Kullanma JavaScript Fonksiyonları: this Kullanımı JavaScript Fonksiyonlari: arguments Nesnesi JavaScript Fonksiyonları: rest Parametreleri JavaScript Fonksiyonları: Function Yapılandırıcısı  (Bu makale) JavaScript Fonksiyonları: getter ve setter Fonksiyonlar JavaScript Fonksiyonları: Arrow (ok) Fonksiyonları JavaScript Fonksiyonları: Üretici Fonksiyonlar - Generator Functions
Ekleyen: canora
Değiştiren: canora
27.06.16 00:42
JavaScript Fonksiyonları: Function Nesnesi
Daha önceki makalelerimizde de belirttiğimiz gibi  fonksiyonlar birer nesnedir ve bundan dolayı her fonksiyon bir değer olarak kullanılabilir. Fonksiyon nesneleri  Function  nesnesinden türetilir. Yani  function  ile bir tanımlama yaptığınızda oluşturulan şey  Function  sınıfının bir örneğidir, dolayısıyla bir nesne / değerdir. Function  nesnesini kullanarak biz de fonksiyonlar oluşturabiliriz. Kullanımı: new Function([[Parametre1,[Parametre2,[...]]],[Fonksiyon Gövdesi]]); Kullanımdan anlaşılacağı gibi ilk parametreler eğer varsa fonksiyonun parametrelerinin adlarını tanımlıyor. Son kullanılan parametre ise fonksiyonun gövdesini  string  olarak bildirmek için kullanılıyor. Tabi parametreler yoksa doğrudan fonksiyon gövdesini tek parametre olarak yazabilirsiniz. Veya hiç parametre veya fonksiyon gövdesi kullanmadan da tanımlayabilirsiniz. Parametreli örnek: var toplama = new Function("sayi1", "sayi2", "return sayi1 + sayi2;"); console.log(toplama(3, 5)); Çıktısı: 8 Bu örnekte tanımlanan fonksiyon şununla aynıdır: function toplama(sayi1, sayi2) { return sayi1 + sayi2; } console.log(toplama(3, 5)); Parametresiz örnek: var mesajYaz = new Function("console.log('Merhaba.');"); mesajYaz(); Çıktısı: Merhaba. Bu örnekte tanımlanan fonksiyon şununla aynıdır: function mesajYaz() { console.log("Merhaba."); } mesajYaz() Function Nesnesinin Özellik ve Metotları Function nesnesi bazı yararlı özellik ve metotlara sahiptir. Bir fonksiyonu fonksiyon bildirimi veya fonksiyon ifadesi olarak tanımladığınızda da bu özellik ve metotları kullanabilirsiniz. Function.arguments Özelliği: (Bu özellik eskimiş bir özelliktir. Bunun yerine  JavaScript Fonksiyonlari: arguments Nesnesi  makalemizde açıklanan arguments değişkenini kullanın. Ancak yine de bir çok tarayıcıda çalışır.) Function.arguments   özelliği, fonksiyona gelen parametreleri tutan dizi şeklinde bir değerdir. Örnek: function deneme(a, b) { console.log(deneme.arguments[0]); console.log(deneme.arguments[1]); console.log(deneme.arguments[2]); } deneme(1, 2); Çıktısı: 1 2 undefined Örnekte fonksiyona 3. parametre gönderilmediğinden   arguments[2]   ,  undefined   olmuştur. Function.caller Özelliği: (Bu özellik standart değildir ve standarda eklenecek özellikler listesinde de yer almamaktadır.) caller  özelliği fonksiyonu çağıran fonksiyonun referansını döndürür. Örnek: function deneme2() { console.log(deneme2.caller); } function deneme() { console.log(deneme.caller); deneme2(); } deneme(); Çıktısı: null deneme() Örnekte  deneme  fonksiyonu çağırılıyor, bu fonksiyon içinden de  deneme2  fonksiyonu çağırılıyor. Her iki fonksiyon içinden de kendilerini çağıran fonksiyonları çıktıya yazmaları isteniyor. Çıktıda görüldüğü gibi  deneme  fonksiyonu herhangi bir fonksiyon içinden çağırılmadığı için  caller ,  null  döndürülüyor. Bazı tarayıcılarda  deneme()  şeklinde bir çıktı yerine yerine fonksiyonun tamamını da görebilirsiniz. Function.length Özelliği: Bu özellik, fonksiyona gelmesi beklenen / fonksiyon tanımında belirtilen özellik sayısını döndürür. Örnek: function deneme(a, b, c) { console.log(deneme.length); } deneme(1, 2); Çıktısı: 3 Örnekte görüldüğü gibi beklenen / bildirilen parametre sayısı veriliyor. Gönderilen parametre sayısı değil. Function.displayName Özelliği: (Bu özellik standart değildir ve standarda eklenecek özellikler listesinde de yer almamaktadır.) Bu özellik bir fonksiyona atandığında, konsol veya JavaScript durum izlemelerinde (profiler) fonksiyon bu isimle gösterilir. Örnek: function deneme() { console.log(deneme.displayName); } deneme() deneme.displayName = "Deneme Fonksiyonu"; deneme(); Çıktısı: undefined Deneme Fonksiyonu Function.name Özelliği: Referansı verilen fonksiyonun adını döndürür. Örnek: function deneme() { } // Bir fonksiyon bildirimi var f = function () { }; // Bir fonksiyon ifadesi (anonim, isimsiz) var testF = function test() { }; // İsimli bir fonksiyon ifadesi var nesne = { birFonksiyon: function () { } // Bir nesne içinde fonksiyon ifadesi. , baskaFonksiyon: function baska() { } // Bir nesne içinde isimli fonksiyon ifadesi. } console.log(deneme.name); console.log(f.name); console.log(testF.name); console.log(nesne.birFonksiyon.name); console.log(nesne.baskaFonksiyon.name); Çıktısı: deneme (an empty string) test (an empty string) baska Görüldüğü gibi bir nesne içinde veya dışında tanımlanmış fonksiyon ifadelerinde eğer isim tanımlanmışsa (örnekte test) isim döndürülüyor, aksi halde boş bir string döndürüyor. ((an empty string) ifadesi, Firefox hata ayıklayıcıda çıktının boş bir metin olduğunu bildiriyor.) Eğer Edge tarayıcısında aynı örneği denerseniz, çıktı: deneme test birFonksiyon baska şeklinde olacaktır (deneme metninden sonra bir boş satır var). Function.prototype.call Metodu: Bu yöntem, bir fonksiyonu çalıştırmak için kullanılır. Kullanımı: call(thisParametresi[,Parametre1[,Parametre2,[...]]]); Bu kullanımdaki  thisParametresi  ile belirtilen ilk parametre, bir nesnenin kapsamını çağırılan fonksiyona geçirmek için kullanılır. Sonraki parametreler, fonksiyona gönderilecek parametrelerdir. Örnek: function tamAdOlustur(adi, soyadi) { this.tamAdi = adi + " " + soyadi; } function Kisi(adi, soyadi) { this.adi = adi; this.soyadi = soyadi; tamAdOlustur.call(this, adi, soyadi); } var ogretmen = new Kisi("Ahmet", "Geçe"); console.log(ogretmen.tamAdi); Çıktısı: Ahmet Geçe Örnekte  Kisi  isimli yapılandırıcı fonksiyon içinden çağırılan  tamAdOlustur  fonksiyonu doğrudan değil  call  metodu ile çağırılmıştır.  call  yönteminde gönderilen ilk parametre olan  this , oluşturulan örneğin kapsamını  tamAdOlustur  fonksiyona geçmektedir. Bundan dolayı  tamAdOlustur  fonksiyonunun içinde sanki  Kisi  fonksiyonunun içindeymiş gibi  this  kullanılabilmekte ve oluşturulan örneğin (nesnenin)  tamAdi  özelliğine bir değer atanmaktadır. Örnek 2: function Urun(adi, fiyati) { this.adi = adi; this.fiyati = fiyati; } function Giyecek(adi, fiyati) { Urun.call(this, adi, fiyati); this.kategori = "Giyecek"; } function Yiyecek(adi, fiyati) { Urun.call(this, adi, fiyati); this.kategori = "Yiyecek"; } var elma = new Yiyecek("Elma", 4); var pantolon = new Giyecek("Pantolon", 44); Bu örnekte  Urun   fonksiyonu, ortak özellikleri olan sınıflar için bu özelliklerle sınırlı olmak şartıyla bir ortak yapılandırıcı olarak kullanılıyor. Bir nesne içinde tanımlanan fonksiyonu da  nesneAdi.fonksiyonAdi.call  şeklinde çağırabilirsiniz. call  metoduna gönderilen  thisParametresi  , eğer  null  veya  undefined  olursa global nesne ile (web sayfalarında  window  nesnesi) değiştirilir. Bu değer eğer temel tiplerden birisi olursa, örneğin bir sayı gönderirseniz, gönderilen değer nesneye dönüştürülür. Function.prototype.apply Metodu: Bu metot  call  ile aynı işi yapar. Kullanımı: apply(thisParametresi[,parametreDizisi]); Görüldüğü gibi  call  ile aralarındaki fark parametrelerin bir dizi olarak gönderilmesidir. Bu,  Function.arguments  özelliği ve  JavaScript Fonksiyonlari: arguments Nesnesi   makalemizde açıkladığımı arguments değişkeni ile beraber kullanıldığında kolaylık sağlar. Birinci  call  örneğini  apply  ile yapalım: function tamAdOlustur(adVeSoyadDizisi) { this.tamAdi = adVeSoyadDizisi[0] + " " + adVeSoyadDizisi[1]; } function Kisi(adi, soyadi) { this.adi = adi; this.soyadi = soyadi; tamAdOlustur.apply(this, [adi, soyadi]); } var ogretmen = new Kisi("Ahmet", "Geçe"); console.log(ogretmen.tamAdi); Çıktısı: Ahmet Geçe İsimsiz bir fonksiyonu  call  veya  apply  ile çağırmak isterseniz fonksiyonu parantez içine alın. Örnek: (function(a, b) { return a * b; }).call(this, 3, 5); Function.prototype.bind Metodu: bind  metodu, çağırıldığında, fonksiyonun içinde kullanılacak  this  değeri belirtilen bir nesne veya fonksiyon kapsamı olan bir  fonksiyon döndürür . Daha sonra bu dönen fonksiyonu kullanarak fonksiyonu istediğimiz nesnenin veya fonksiyonun kapsamında çalıştırabiliriz. Yeni fonksiyon içinde kullanılan  this , bizim belirttiğimiz nesne veya fonksiyon kapsamına işaret eder. Kullanımı: bind(thisParametresi[,Parametre1[,Parametre2,[...]]]); Bu metodun kullanımı görüldüğü gibi  call  metodu ile aynı,  apply  metodu ile benzerdir ( apply 'de  thisParametresi  zorunlu değil).  bind  metodunun  call   ve  apply 'den farkı bir fonksiyon döndürmesidir.  call  ve  apply  ise fonksiyonu çalıştırırlar. Örnek: var genislik = 10; var sekil = { genislik: 3, genislikYaz: function () { console.log(this.genislik) } } sekil.genislikYaz(); // 3 yazar var genislikYazFonksiyonu = sekil.genislikYaz; genislikYazFonksiyonu(); // 10 yazar genislikYazFonksiyonu = sekil.genislikYaz.bind(sekil); genislikYazFonksiyonu(); // 3 yazar Çıktısı: 3 10 3 Örnekte nesne dışında tanımlanan  genislik  değişkeni ( var genislik = 10  satırı) global nesne olan  window  nesnesinin bir özellik / değişken değeri olacaktır. Bir nesne veya yapılandırıcı bir fonksiyon içinde kullanılmayan  this ,  window  nesnesini işaret eder. Bu şekilde  console.log(this.genislik)   yazmak window nesnesine bağladığımız  genislik  değişkeninin değerini yazacaktır. sekil   nesnesinin  genislikYaz   yöntemi çağırıldığında ( sekil.genislikYaz()    şeklinde)   console.log(this.genislik)   ifadesi, sekil nesnesinin  genislik   değerini yani 3 değerini yazmaktadır. Ancak  sekil.genislikYaz   fonksiyonunu bir değişkene atayıp çalıştırdığımızda sadece fonksiyonu atamış olduğumuzdan, bu değişken aracılığıyla fonksiyon çalıştırıldığında (ilk  genislikYazFonksiyonu()   ifadesi) fonksiyon içindeki  this  ,  window   nesnesine işaret edeceğinden 10 değerini yazmaktadır. İşte bu durumda nesne içindeki fonksiyonun referansını almak yerine,  bind  metoduyla  thisParametresi  olarak sekil nesnesini gönderip fonksiyonun bir kopyasını alarak çalıştırdığımızda fonksiyon içindeki  this  sekil nesnesine işaret etmekte ve 3 sonucunu almaktayız. bind  metoduna  thisParametresi  haricinde gönderilen parametre değerleri, dönen fonksiyonda sabitlenir ve atadığımız değişken vasıtasıyla fonksiyonu çağırdığımızda her zaman bu parametreler  bind  sırasında belirtiğimiz değerlere sahip olacaktır. Fonksiyonu, atandığı değişkeni kullanarak çağırırken  bind  sırasında bildirilmeyen parametreleri kullanabiliriz. Örnek: function parametreleriYaz(a, b, c, d) { console.log(a, b, c, d); } var parametreleriYazan = parametreleriYaz.bind(window, 1, 2); parametreleriYazan(3, 4); Çıktısı: 1 2 3 4 Görüldüğü gibi  bind  sırasında verilen 1 ve 2 parametrelerini  parametreleriYazan  değişkeni vasıtasıyla fonksiyonu çağırdığımızda belirtmedik. Diğer parametreleri bildirdik.  bind  ile dönen fonksiyonda,  bind  ile verilen parametre değerleri sabit olarak kabul edilir ve bu fonksiyonu sonradan çağırdığımızda varsayılan değer olarak kalıyorlar. Fonksiyonu çağırdığımızda verilen parametreler, bu parametrelerden sonraki parametreler olarak kabul edilir. Function.prototype.isGenerator Metodu: (Bu metod henüz standart olmamıştır.) isGenerator  metodu, fonksiyonun bir üretici fonksiyon (generator function, * ile tanımlanmış, yield kullanan fonksiyonlar) olup olmadığını test etmek için kullanılır. Üretici fonksiyonlar ileride açıklanacaktır. Function.prototype.toSource Metodu: (Bu metod henüz standart olmamıştır.) toSource  metodu, bir nesnenin kaynak kodunu  string   olarak döndürür. Fonksiyonlar da birer nesne olduğundan bu metot ile fonksiyonun kaynak kodunu  string  olarak elde edebiliriz. Ancak yerleşik fonksiyonlarda fonksiyonunun yerleşik kod (native code) olduğunu bildiren bir  string  alırız. Örnek: function deneme(a, b) { console.log(a, b); } var nesne = { x: 10, yaz: function() { console.log(this.x) } }; console.log(deneme.toSource()); console.log(nesne.toSource()); console.log(String.split.toSource()); // String.split yerleşik bir fonksiyondur. Çıktısı: function deneme(a, b) {             console.log(a, b);         } ({x:10, yaz:(function () { console.log(this.x) })}) function split() {     [native code] } Function.prototype.toString Metodu: toString  metodu, nesnelerin  string  bir ifadesini verir. Eğer kullanılan nesne kendi tanımladığımız bir fonksiyon ise kaynağını  string  olarak alırız. Ancak yerleşik JavaScript fonksiyonları ve nesneler için fonksiyonun yerel kod olduğunu veya nesnenin tipini bildiren bir ifade ile karşılaşırız. Bu metodu fonksiyonun  string  halini almak için kullanabiliriz. Örnek: function deneme(a, b) { console.log(a, b); } var nesne = { x: 10, yaz: function() { console.log(this.x) }; }; console.log(deneme.toString()); console.log(nesne.toString()); console.log(String.split.toString()); // String.split yerleşik bir fonksiyondur. Çıktısı: function deneme(a, b) {             console.log(a, b);         } [object Object] function split() {     [native code] } JavaScript Fonksiyonları ile İlgili Makaleler: JavaScript Fonksiyonları: Temel Kullanım JavaScript Fonksiyonları: Fonksiyonun Kendini Çağırması (Recursion) JavaScript Foksiyonları: Fonksiyon İfadeler - Function Expressions JavaScript Fonksiyonları: Kapsanımlar - Closures Javascript Fonksiyonları: Yerinde Çalıştırılan İsimsiz Fonksiyonlar JavaScript Fonksiyonları: Nesne İçinde Fonksiyon - Metotlar JavaScript Fonksiyonları: Nesne Yapılandırıcısı Olarak Fonksiyon Kullanma JavaScript Fonksiyonları: this Kullanımı JavaScript Fonksiyonlari: arguments Nesnesi JavaScript Fonksiyonları: rest Parametreleri JavaScript Fonksiyonları: Function Nesnesi  (Bu makale) JavaScript Fonksiyonları: getter ve setter Fonksiyonlar JavaScript Fonksiyonları: Arrow (ok) Fonksiyonları JavaScript Fonksiyonları: Üretici Fonksiyonlar - Generator Functions
Ekleyen: canora
Değiştiren: canora

En fazla 3 eski durum gösterilir.