Skip to content

Commit 33efc05

Browse files
author
Lukasz Kufel
committed
Polish translation of function and array sections.
1 parent ea8b09f commit 33efc05

File tree

10 files changed

+509
-3
lines changed

10 files changed

+509
-3
lines changed

doc/pl/array/constructor.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
## Konstruktor `Array`
2+
3+
Zaleca się zawsze korzystać z literału tablicy - notacja `[]` - podczas tworzenia
4+
nowych tablic, ponieważ konstruktor `Array` niejednoznacznie interpretuje
5+
parametry do niego przekazane.
6+
7+
[1, 2, 3]; // Rezultat: [1, 2, 3]
8+
new Array(1, 2, 3); // Rezultat: [1, 2, 3]
9+
10+
[3]; // Rezultat: [3]
11+
new Array(3); // Rezultat: []
12+
new Array('3') // Rezultat: ['3']
13+
14+
W przypadku gdy tylko jeden argument zostanie przekazany do kostruktora `Array` i
15+
ten argument jest typu `Number`, konstruktor zwróci nową *dziwną* tablicę
16+
z ustawioną właściwością `length` na wartość przekazaną jako argument. Należy
17+
zauważyć, że **tylko** właściwość `length` zostanie ustawiona w ten sposób,
18+
rzeczywiste indeksy w tej tablicy nie zostaną zainicjalizowane.
19+
20+
var arr = new Array(3);
21+
arr[1]; // undefined
22+
1 in arr; // zwraca false, indeks nie został ustawiony
23+
24+
Możliwość ustanienia z góry długości tablicy jest użyteczna tylko w kilku
25+
przypadkach, jak powtarzanie ciągu znaków, w którym unika się stosowania
26+
pętli `for`.
27+
28+
// count - ilosc powtorzen
29+
// stringToRepeat - ciąg znaków do powtórzenia
30+
new Array(count + 1).join(stringToRepeat);
31+
32+
### Wnioski
33+
34+
W miare możliwości należy unikać używania konstruktora `Array`. Literały są
35+
zdecydowanie lepszym rozwiązaniem, są krótsze i mają bardziej precyzyjną składnię.
36+
Zwiększają również czytelność kodu.
37+

doc/pl/array/general.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
## Iterowanie po tablicach oraz właściwości tablic
2+
3+
Mimo, że tablice w JavaScript są obiektami, nie ma dobrych powodów do używania
4+
[`pętli for in`](#object.forinloop) do iteracji po nich. W rzeczywiści istnieje
5+
wiele dobrych powodów **przeciwko** wykorzystania `for in` na tablicach.
6+
7+
> **Uwaga:** Tablice JavaScriptowe **nie***tablicami asocjacyjnymi*. JavaScript
8+
> posiada tylko [obiekty](#object.general) do mapowania kluczy do wartości. Jednakże
9+
> tablice asocjacyjne **zachowują** porządek, natomiast obiekty **nie zachowują**.
10+
11+
Ponieważ pętla `for in` wylicza wszystkie właściwości, które są wewnątrz
12+
łańcucha prototypów i jedynym sposobem aby wykluczyć te właściwości to użycie
13+
[`hasOwnProperty`](#object.hasownproperty), ale wówczas pętla staje się
14+
**dwadzieście razy** wolniejsza od normalnej pętli `for`.
15+
16+
### Iteracja
17+
18+
W celu osiągnięcia najlepszej wydajności podczas iteracji po tablicach należy
19+
użyć klasycznej pętli `for`.
20+
21+
var list = [1, 2, 3, 4, 5, ...... 100000000];
22+
for(var i = 0, l = list.length; i < l; i++) {
23+
console.log(list[i]);
24+
}
25+
26+
Jest tam jeszcze jeden dodatkowy haczyk w przykładzie powyżej. Jest to zbuforowanie
27+
długości tablicy poprzez `l = list.length`.
28+
29+
Mimo, że właściwość `length` jest zdefiniowana w wewnątrz tablicy, istnieje nadal
30+
dodatkowy koszt na wyszukiwanie tej właściwości przy każdej iteracji w pętli.
31+
Chociaż najnowsze silniki JavaScript **mogą** zastosować optymalizację w tym
32+
przypadku. Nie ma jednak możliwość ustalenia czy kod będzie wykonywany w jednym
33+
z tych nowych silników czy też nie.
34+
35+
W rzeczywistości pomijając buforowanie długości tablicy może spowodować, że pętla
36+
będzie tylko **w połowie tak szybka** jak ta z buforowaniem długości.
37+
38+
### Właściwość `length`
39+
40+
Mimo, że *getter* właściwości `length` po prostu zwraca liczbę elementów, które są
41+
zawarte w tablicy, to *setter* może być użyta do **skracania** tablicy.
42+
43+
var foo = [1, 2, 3, 4, 5, 6];
44+
foo.length = 3;
45+
foo; // [1, 2, 3]
46+
47+
foo.length = 6;
48+
foo; // [1, 2, 3]
49+
50+
Przypisanie mniejszej długości spowoduje skrócenie tablicy, ale zwiększenie wartości
51+
`length` nie ma żadnego wpływu na tablicę.
52+
53+
### Wnioski
54+
55+
Aby uzyskać najlepszą wydajność zaleca się, aby zawsze używać zwykłej pętli `for`
56+
i zbuforowanie właściwości `length`. Korzystanie z pętli `for in` na tablicy jest
57+
znakiem źle napisanego kodu, który jest podatny na błędy i ma słabą wydajność.
58+

doc/pl/full_index.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
]
5656
},
5757
{
58-
"title": "?Wnętrze?",
58+
"title": "Jądro",
5959
"dir": "core",
6060
"articles": [
6161
"eval",

doc/pl/function/arguments.md

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
## obiekt `arguments`
2+
3+
Każda zasięg funkcyjny w języku JavaScript ma dostęp do specjalnej zmiennej `arguments`.
4+
Ta zmienna trzyma listę wszystkich argumentów przekazanych do funkcji.
5+
6+
> **Uwaga:** W przypadku gdy `arguments` zostanie zadeklarowana wewnatrz funkcji
7+
> poprzez `var` lub jako nazwa jednego z formalnych parametrów, obiekt `arguments`
8+
> nie zostanie utworzony.
9+
10+
Obiekt `arguments` **nie** jest typu `Array`. Mimo, że posiada pewne cechy
11+
semantyki tablic - właściwość `length` - to nie dziedziczy on z `Array.prototype`,
12+
ale w rzeczywistości z `Object`.
13+
14+
Ze względu na to **nie** można używać standardowych dla tablic metod takich jak
15+
`push`, `pop` czy `slice` na obiekcie `arguments`. Mimo, że iteracja przy pomocy
16+
pętli `for` działa dobrze, to aby skorzystać ze standardowych metod tablicowych
17+
należy skonwertować `arguments` do prawdziwego obiekt `Array`.
18+
19+
### Konwersja do tablicy
20+
21+
Poniższy kod zwróci nowy obiekt `Array` zawierający wszystkie elementy
22+
obiektu `arguments`.
23+
24+
Array.prototype.slice.call(arguments);
25+
26+
Jednakże konwersja ta jest **wolna** i **nie jest zalecana** w sekcjach,
27+
które mają duży wpływ na wydajność.
28+
29+
### Przekazywanie argumentów
30+
31+
Zalecany sposób przekazywania argumentów z jednej funkcji do następnej
32+
wyglada następująco.
33+
34+
function foo() {
35+
bar.apply(null, arguments);
36+
}
37+
function bar(a, b, c) {
38+
// do stuff here
39+
}
40+
41+
Kolejną sztuczką jest użycie razem `call` i `apply` w celu stworzenia
42+
szybkich i nieograniczonych wrapperów.
43+
44+
function Foo() {}
45+
46+
Foo.prototype.method = function(a, b, c) {
47+
console.log(this, a, b, c);
48+
};
49+
50+
// Stworzenie nieograniczoną wersję metody "method"
51+
// która przyjmuje parametry: this, arg1, arg2...argN
52+
Foo.method = function() {
53+
54+
// Rezultat: Foo.prototype.method.call(this, arg1, arg2... argN)
55+
Function.call.apply(Foo.prototype.method, arguments);
56+
};
57+
58+
59+
### Parametry formalne i indeksy argumentów
60+
61+
Obiekt `arguments` tworzy funckje *getter* i *setter* nie tylko dla swoich
62+
właściwości, ale również dla parametrów formalnych funkcji.
63+
64+
W rezultacie zmiana wartości parametru formalnego zmieni również wartość
65+
odpowiadającemu mu wpisowi w obiekcie `arguments`, zachodzi to również w drugą stronę.
66+
67+
function foo(a, b, c) {
68+
arguments[0] = 2;
69+
a; // 2
70+
71+
b = 4;
72+
arguments[1]; // 4
73+
74+
var d = c;
75+
d = 9;
76+
c; // 3
77+
}
78+
foo(1, 2, 3);
79+
80+
### Mity i prawdy o wydajności
81+
82+
Obiekt `arguments` jest zawsze tworzony z wyjątkiem dwóch przypadków, gdy
83+
zmienna o takiej nazwie jest zdefiniowana wewnątrz funkcji lub jeden z parametrów
84+
formalnych funkcji ma taką nazwę. Nie ma znaczenia czy obiekt `arguments` jest
85+
używany czy nie.
86+
87+
Zarówno *gettery* jak i *settery* są zawsze tworzone, zatem używanie ich nie ma
88+
praktycznie żadnego wpływu na wydajność. Zwłaszcza w rzeczywistym kodzie, który
89+
wykorzystuje coś więcej niż tylko prosty dostęp do właściwości obiektu `arguments`.
90+
91+
> **Uwaga ES5:** *gettery* and *settery* nie są tworzone w trybie strict mode
92+
93+
Jednakże, istnieje jeden przypadek w którym wydajność drastycznie spada w
94+
nowoczesnych silnikach JavaScript. Ten przypadek to wykorzystanie
95+
`arguments.callee`.
96+
97+
function foo() {
98+
arguments.callee; // operowanie na obiekcie funkcji
99+
arguments.callee.caller; // i obiekcie funkcji wywołującej
100+
}
101+
102+
function bigLoop() {
103+
for(var i = 0; i < 100000; i++) {
104+
foo(); // Normalnie zostałaby wykorzystana metoda inline
105+
}
106+
}
107+
108+
W powyższym przykładzie `foo` nie może zostać wykorzystana metoda [inline][1]
109+
ponieważ potrzebne są nie tylko informacje na własny temat ale również
110+
na temat funkcji wywołującej. Takie użycie nie tylko uniemożliwia
111+
inlining i korzyści z niej wynikające, ale również stanowi złamanie
112+
zasad enkapsulacji ponieważ ta funkcja jest zależna od kontekstu
113+
w jakim została wywołana.
114+
115+
**Mocno zalecane** jest aby **nigdy** nie korzystać z `arguments.callee`
116+
i żadnej jej własności.
117+
118+
> **Uwaga ES5:** W trybie strict mode, `arguments.callee` wyrzuci `TypeError`
119+
> ponieważ korzystanie z niej jest przestarzałe.
120+
121+
[1]: http://en.wikipedia.org/wiki/Inlining
122+

doc/pl/function/closures.md

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
## Domknięcia i referencje
2+
3+
Jedną z najpotężniejszych funkcjonalności języka JavaScript są *domknięcia*,
4+
oznacza to że zasięg **zawsze** posiada dostęp do zewnętrznego zasięgu w którym
5+
został zdefiniowany. Ponieważ zasięg w JavaScript można definiować tylko poprzez
6+
[funckję](#function.scopes), wszystkie funkcje domyślnie zachowują się jak domknięcia.
7+
8+
### Emulowanie prywatnych zmiennych
9+
10+
function Counter(start) {
11+
var count = start;
12+
return {
13+
increment: function() {
14+
count++;
15+
},
16+
17+
get: function() {
18+
return count;
19+
}
20+
}
21+
}
22+
23+
var foo = Counter(4);
24+
foo.increment();
25+
foo.get(); // 5
26+
27+
Tutaj `Counter` zwraca **dwa** domknięcia: funkcję `increment` oraz funckję `get`.
28+
Obie te funkcję trzymają **referencję** do zasięgu `Counter` a co za tym idzie
29+
zawsze posiadają dostęp do zmiennej `count` tak, jakby ta zmienna była zdefiniowana
30+
w zasięgu tych funkcji.
31+
32+
### Dlaczego zmienne przywatne działają
33+
34+
Ponieważ nie ma możliwości wskazania lub przypisania zasięgu w JavaScript, to
35+
**nie** istnieje sposób aby uzyskać dostęp do zmiennej `count` z zewnątrz.
36+
Wykorzystanie tych dwóch domkinęć jest jedynym sposobem na interakcję z tą zmienną.
37+
38+
var foo = new Counter(4);
39+
foo.hack = function() {
40+
count = 1337;
41+
};
42+
43+
44+
Powyższy kod **nie** zmieni wartości zmiennej `count` wewnątrz zasięgu `Counter`,
45+
ponieważ `foo.hack` nie została zadeklarowana wewnątrz **tego konkretnego** zasięgu.
46+
Zamiast tego funkcja utworzy lub nadpisze *globalną* zmienną `count`.
47+
48+
### Domknięcia wewnątrz pętli
49+
50+
Jednym z częstrzych błędów jest wykorzystywanie domknięć wewnątrz pętli,
51+
aby wartość zmiennej po której odbywa się iteracja był kopiowana do
52+
wewnętrznej funkcji.
53+
54+
for(var i = 0; i < 10; i++) {
55+
setTimeout(function() {
56+
console.log(i);
57+
}, 1000);
58+
}
59+
60+
Powyższy kod **nie** wypisze numerów od `0` do `9`, ale wypisze
61+
dziesięć razy liczbę `10`.
62+
63+
*Anonimowa* funkcja trzyma **wskaźnik** do zmiennej `i` i podczas uruchomienia
64+
`console.log`, pętla `for` już zakończyła działanie i wartość zmiennej `i`
65+
została ustawiona na `10`.
66+
67+
Aby otrzymać zamierzony efekt, niezbędne jest **skopiowanie** wartości
68+
zmiennej `i`.
69+
70+
### Unikanie problemu z referencją
71+
72+
Aby skopiować wartość zmiennej, po której iterujemy w pętli, należy skorzystać
73+
z [anonimowego wrappera](#function.scopes).
74+
75+
for(var i = 0; i < 10; i++) {
76+
(function(e) {
77+
setTimeout(function() {
78+
console.log(e);
79+
}, 1000);
80+
})(i);
81+
}
82+
83+
Zewnętrzna anonimowa funkcja zostaje wywołana od razu z parametrem `i`
84+
jako pierwszym argumentem i otrzyma kopię **wartości** zmiennej `i` jako
85+
zmienną `e`.
86+
87+
Anonimowa funkcja która zostaje przekazana do `setTimeout` teraz posiada
88+
referencję do zmiennej `e`, która nie zostanie zmieniona przez pętle `for`.
89+
90+
Istnieje jeszcze jeden sposób na osiągnięcie tego samego efektu. Należy zwrócic
91+
fukcję z anonimowego wrappera, wówczas kod będzie zachowywał się jak ten
92+
wcześniejszy.
93+
94+
for(var i = 0; i < 10; i++) {
95+
setTimeout((function(e) {
96+
return function() {
97+
console.log(e);
98+
}
99+
})(i), 1000)
100+
}
101+

doc/pl/function/general.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
## Deklaracje funkcji i wyrażenia funkcyjne
2+
3+
Funcje w języku JavaScript są [typami pierwszoklasowymi][1]. Co oznacza, że mogą
4+
być przekazywane jak każda inna wartość. Jednym z typowych zastosowań tej cechy
5+
jest przekazywanie *anonimowej funkcji* jako callback do innej, prawdopodobnie
6+
asynchronicznej funkcji.
7+
8+
### Deklaracja funckcji
9+
10+
function foo() {}
11+
12+
Powyższa funkcja zostaje [wyniesiona](#function.scopes) zanim program wystartuje, dzięki temu
13+
jest dostępna *wszędzie* w ramach zasięgu, w którym została *zadeklarowana*,
14+
nawet jeżeli ta funkcja została wywołana przed faktyczną definicją w kodzie źródłowym.
15+
16+
foo(); // Działa ponieważ definicja funkcji została wyniesiona na początek zasięgu przed uruchomieniem kodu
17+
function foo() {}
18+
19+
### Wyrażenie funkcyjne
20+
21+
var foo = function() {};
22+
23+
Ten przykład przypisuje nienazwaną i *anonimową* funkcję do zmiennej `foo`.
24+
25+
foo; // 'undefined'
26+
foo(); // wyrzuca błąd TypeError
27+
var foo = function() {};
28+
29+
Ze względu na fakt, że deklaracja `var` wynosi zmienną `foo` na początek zasięgu,
30+
zanim kod faktycznie zostanie uruchomiony, `foo` będzie zdefiniowane kiedy skrypt
31+
będzie wykonywany.
32+
33+
Ale ponieważ przypisania robione są dopiero podczas wykonania, wartość `foo` będzie
34+
ustawiona na domyślną wartość [undefined](#core.undefined) zanim powyższy kod
35+
zostanie uruchomiony.
36+
37+
### Nazwane wyrażenia funkdyjne
38+
39+
Kolejnym specjalnym przypadkiem jest przypisanie nazwanej funkcji.
40+
41+
var foo = function bar() {
42+
bar(); // Działa
43+
}
44+
bar(); // wyrzuca ReferenceError
45+
46+
W zewnętrznym zakresie `bar` nie będzie dostępne, ponieważ funkcja zostaje
47+
przypisana do `foo`, jednakże w wewnętrznym zakresie `bar` będzie dostępna.
48+
Jest to spowodowane tym, jak działa [rozwiązywanie nazw](#function.scopes)
49+
w języku JavaScript. Nazwa funkcji jest *zawsze* dostępna w lokalnym
50+
zakresie tej funkcji.
51+
52+
[1]: http://pl.wikipedia.org/wiki/Typ_pierwszoklasowy

0 commit comments

Comments
 (0)