Skip to content

Commit 2198e3d

Browse files
committed
translated function/arguments
1 parent d0f7c68 commit 2198e3d

File tree

1 file changed

+124
-0
lines changed

1 file changed

+124
-0
lines changed

doc/tr/function/arguments.md

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
## `arguments` nesnesi
2+
3+
JavaScript'te her fonksiyon kapsamında `arguments` adlı özel bir nesne
4+
tanımlıdır. Bu nesne fonksiyon çağrılırken verilen argümanların listesini
5+
içerir.
6+
7+
> **Not:** Eğer `arguments` adında bir değişken fonksiyon kapsamında bir `var`
8+
> ifadesi ile veya tanımlı parametre olarak zaten mevcutsa, `arguments` nesnesi
9+
> oluşturulmaz.
10+
11+
`arguments` nesnesi bir `Array` *değildir*. Bir dizinin özelliklerinin bir
12+
kısmına sahip olsa da (`length` özelliği) `Array.prototype` sınıfından
13+
türetilmemiştir, aslında bir `Object` bile değildir.
14+
15+
Bu nedenle, `arguments` nesnesi üzerinde `push`, `pop` ve `slice` gibi standart
16+
dizi metotlarını kullanmak mümkün **değildir**. Klasik `for` döngüsü `arguments`
17+
nesnesi ile kullanılabilir, ancak standart dizi metotlarını kullanmak için
18+
gerçek bir diziye dönüştürmek gerekir.
19+
20+
### Diziye dönüştürmek
21+
22+
Aşağıdaki program parçası `arguments` nesnesinin tüm elemanlarına sahip yeni bir
23+
dizi verecektir.
24+
25+
Array.prototype.slice.call(arguments);
26+
27+
Bu dönüşüm **yavaştır**, ve performansın belirleyici olduğu durumlarda
28+
kullanılması **tavsiye olunmaz**.
29+
30+
### Argümanların geçirilmesi
31+
32+
Aşağıdaki örnekte, argümanların bir fonksiyondan diğerine geçirilmesi
33+
için önerilen yöntem gösterilmiştir.
34+
35+
function foo() {
36+
bar.apply(null, arguments);
37+
}
38+
function bar(a, b, c) {
39+
// do stuff here
40+
}
41+
42+
Bir başka püf noktası da `call` ve `apply` 'ı birlikte kullanarak hızlı,
43+
ilişkisiz fonksiyonlar yaratmaktır.
44+
45+
function Foo() {}
46+
47+
Foo.prototype.method = function(a, b, c) {
48+
console.log(this, a, b, c);
49+
};
50+
51+
// "method" 'un ilişkisiz bir versiyonunu yarat
52+
// Aldığı parametreler: this, arg1, arg2...argN
53+
Foo.method = function() {
54+
55+
// Sonuç: Foo.prototype.method.call(this, arg1, arg2... argN)
56+
Function.call.apply(Foo.prototype.method, arguments);
57+
};
58+
59+
60+
### Tanımlı parametreler ve argüman indisleri
61+
62+
`arguments` nesnesi her iki özelliği ve fonksiyonun tanımlı parametreleri için
63+
*getter* ve *setter* fonksiyonlar oluşturur.
64+
65+
Sonuç olarak, bir tanımlı parametrenin değerini değiştirmek `arguments`
66+
nesnesindeki karşılık gelen özelliğin değerini de değiştirecektir.
67+
68+
function foo(a, b, c) {
69+
arguments[0] = 2;
70+
a; // 2
71+
72+
b = 4;
73+
arguments[1]; // 4
74+
75+
var d = c;
76+
d = 9;
77+
c; // 3
78+
}
79+
foo(1, 2, 3);
80+
81+
### Performans mitleri ve gerçekler
82+
83+
`arguments` nesnesi fonksiyon kapsamında bir değişken veya tanımlı parametre
84+
olarak kullanılmış olması durumları dışında her zaman oluşturulur. Kullanılıp
85+
kullanılmaması fark etmez.
86+
87+
*getter* ve *setter* fonksiyonlar **her zaman** oluşturulur; dolayısıyla
88+
`arguments` nesnesini kullanmanın performans üzerinde olumsuz bir etkisi yoktur,
89+
özellikle de sadece `arguments` nesnesinin özelliklerine erişmekten ibaret
90+
olmayan *gerçek* programlarda.
91+
92+
> **ES5 Notu:** Söz konusu *getter* ve *setter* fonksiyonlar mutlak modda
93+
> oluşturulmaz.
94+
95+
96+
Fakat, modern JavaScript motorlarının performansını ciddi bir şekilde etkileyen
97+
bir durum vardır. Bu durum `arguments.callee` nesnesinin kullanılmasıdır.
98+
99+
function foo() {
100+
arguments.callee; // içinde olduğumuz fonksiyon nesnesi
101+
arguments.callee.caller; // ve çağıran fonksiyon nesnesi
102+
}
103+
104+
function bigLoop() {
105+
for(var i = 0; i < 100000; i++) {
106+
foo(); // Normalde inline edilirdi...
107+
}
108+
}
109+
110+
Yukarıdaki program parçasında, `foo` fonksiyonuna [inlining][1] uygulanması
111+
mümkün değildir çünkü fonksiyonun hem kendisini ve kendisini çağıran fonksiyonu
112+
bilmesi gerekmektedir. Bu yüzden hem inlining yapılamadığı için bir performans
113+
artışı sağlanamamış hem de kapsüllenme bozulmuş olmaktadır, çünkü fonksiyon
114+
artık kendisini çağıran kapsama bağımlı hale gelmiş olabilir.
115+
116+
`arguments.callee` ve özelliklerinin **asla** kullanılmaması
117+
**şiddetle tavsiye olunur**.
118+
119+
> **ES5 Notu:** Mutlak modda `arguments.callee` kullanımı kaldırılmıştır ve
120+
> kullanılması durumunda bir `TypeError` hatası oluşacaktır.
121+
122+
[1]: http://en.wikipedia.org/wiki/Inlining
123+
124+

0 commit comments

Comments
 (0)