diff --git a/README.md b/README.md index cb9cb3d4..be02cfd5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,18 @@ JavaScript Garden ================= +2024 update: this project has not been actively maintained in years. The original author +[took the site down](https://github.com/BonsaiDen/JavaScript-Garden/commit/93278fbcafa569fd193f8784abc267e9db09c645) +in 2022 (no judgement - updating it would be a big project!). At that point it was already long out of date, e.g. missing +the new language features from ES6 onwards. + +Many excellent modern guides exist, e.g. [Eloquent Javascript](https://eloquentjavascript.net/), or +the [MDN guide](https://developer.mozilla.org/en-US/docs/Web/JavaScript). + +Thanks for all the maintainers and translators over the years! + +----- + **JavaScript Garden** is a growing collection of documentation about the most quirky parts of the JavaScript programming language. It gives advice to avoid common mistakes, subtle bugs, as well as performance issues and bad @@ -19,7 +31,7 @@ This guide is the work of two lovely Stack Overflow users, [Ivo Wetzel][6] [many others](https://github.com/BonsaiDen/JavaScript-Garden/graphs/contributors) who've worked hard to provide translations or fixes. -It's currently maintained by [Tim Ruffles](http://twitter.com/timruffles). +It was maintained by [Tim Ruffles](http://twitter.com/timruffles) from 2013-2020ish. ## Contributing diff --git a/doc/by/function/this.md b/doc/by/function/this.md index 5b0f555d..0a85ef5f 100644 --- a/doc/by/function/this.md +++ b/doc/by/function/this.md @@ -62,7 +62,7 @@ // this спасылаецца на глабальны аб'ект } test(); - } + }; Памылковым меркаваннем будзе тое, што `this` унутры `test` будзе спасылацца на `Foo`; Але на самрэч **гэта не так**. @@ -76,7 +76,7 @@ // Тут выкарыстоўвайце self замест this } test(); - } + }; `self` гэта звычайнае імя пераменнай, але яно часта выкарыстоўваецца для спасылкі на знешні `this`. У камбінацыі з [замыканнямі](#function.closures), яно можа быць @@ -90,7 +90,7 @@ // this цяпер спасылаецца на Foo }.bind(this); test(); - } + }; ### Прысвойванне метадаў diff --git a/doc/by/object/prototype.md b/doc/by/object/prototype.md index f5f8c985..ec80e801 100644 --- a/doc/by/object/prototype.md +++ b/doc/by/object/prototype.md @@ -40,7 +40,7 @@ JavaScript гэта адзіная шырока выкарыстоўваемая // Выніковы ланцужок прататыпаў test [instance of Bar] Bar.prototype [instance of Foo] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/en/function/this.md b/doc/en/function/this.md index f123f336..83abff00 100644 --- a/doc/en/function/this.md +++ b/doc/en/function/this.md @@ -63,7 +63,7 @@ mis-design of the language because it **never** has any practical use. // this is set to the global object } test(); - } + }; A common misconception is that `this` inside of `test` refers to `Foo`; while in fact, it **does not**. @@ -77,7 +77,7 @@ local variable inside of `method` that refers to `Foo`. // Use self instead of this here } test(); - } + }; `self` is just a normal variable name, but it is commonly used for the reference to an outer `this`. In combination with [closures](#function.closures), it can also @@ -90,7 +90,7 @@ As of ECMAScript 5 you can use the `bind` method combined with an anonymous func // this now refers to Foo }.bind(this); test(); - } + }; ### Assigning Methods diff --git a/doc/en/object/general.md b/doc/en/object/general.md index 5ee2e0de..89589229 100644 --- a/doc/en/object/general.md +++ b/doc/en/object/general.md @@ -6,9 +6,9 @@ Everything in JavaScript acts like an object, with the only two exceptions being false.toString(); // 'false' [1, 2, 3].toString(); // '1,2,3' - function Foo(){} - Foo.bar = 1; - Foo.bar; // 1 + function sayHello(){} + sayHello.count = 1; + sayHello.count; // 1 A common misconception is that number literals cannot be used as objects. That is because a flaw in JavaScript's parser tries to parse the *dot @@ -32,25 +32,25 @@ Using an object literal - `{}` notation - it is possible to create a plain object. This new object [inherits](#object.prototype) from `Object.prototype` and does not have [own properties](#object.hasownproperty) defined. - var foo = {}; // a new empty object + var names = {}; // a new empty object - // a new object with a 'test' property with value 12 - var bar = {test: 12}; + // a new object with a 'name' property with value 'Rob' + var rob = {name: 'Rob'}; ### Accessing Properties The properties of an object can be accessed in two ways, via either the dot notation or the square bracket notation. - var foo = {name: 'kitten'} - foo.name; // kitten - foo['name']; // kitten + var pet = {name: 'kitten'} + pet.name; // kitten + pet['name']; // kitten var get = 'name'; - foo[get]; // kitten + pet[get]; // kitten - foo.1234; // SyntaxError - foo['1234']; // works + pet.1234; // SyntaxError + pet['1234']; // works The notations work almost identically, with the only difference being that the square bracket notation allows for dynamic setting of properties and @@ -63,13 +63,13 @@ operator; setting the property to `undefined` or `null` only removes the *value* associated with the property, but not the *key*. var obj = { - bar: 1, - foo: 2, - baz: 3 + a: 1, + b: 2, + c: 3 }; - obj.bar = undefined; - obj.foo = null; - delete obj.baz; + obj.a = undefined; + obj.b = null; + delete obj.c; for(var i in obj) { if (obj.hasOwnProperty(i)) { @@ -77,7 +77,7 @@ operator; setting the property to `undefined` or `null` only removes the } } -The above outputs both `bar undefined` and `foo null` - only `baz` was +The above outputs both `a undefined` and `b null` - only `c` was removed and is therefore missing from the output. ### Notation of Keys diff --git a/doc/en/object/prototype.md b/doc/en/object/prototype.md index cb053526..f63abaa9 100644 --- a/doc/en/object/prototype.md +++ b/doc/en/object/prototype.md @@ -41,7 +41,7 @@ chains*. // The resulting prototype chain test [instance of Bar] Bar.prototype [instance of Foo] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/es/function/constructors.md b/doc/es/function/constructors.md index 0850cb4b..9c4e2946 100644 --- a/doc/es/function/constructors.md +++ b/doc/es/function/constructors.md @@ -48,7 +48,7 @@ Cuando una `nueva` keyword es omitidad, la función **no** devuelve un nuevo obj } Foo(); // undefined -Auqnue el ejemplo anterior puede parecer que trabaja en algunos casos, debido +Aunque el ejemplo anterior puede parecer que trabaja en algunos casos, debido a los trabajos de [`this`](#function.this) en JavaScript, que usará el *objeto global* como valor de `this`. diff --git a/doc/es/function/scopes.md b/doc/es/function/scopes.md index d641a939..00ed940c 100644 --- a/doc/es/function/scopes.md +++ b/doc/es/function/scopes.md @@ -47,7 +47,7 @@ mayor implicación. test(); foo; // 21 -Dejando de lador la sentencia `var` dentro de la función `test` sobre escribiría el +Dejando de lado la sentencia `var` dentro de la función `test` sobre escribiría el valor de `foo`. Si bien al principio puede parecer un gran cambio, se tiene miles de líneas de código en JavaScript y no se usaría `var` introduciendose en un horrible y difícil detección de errores. @@ -68,7 +68,7 @@ horrible y difícil detección de errores. El bucle externo terminará después de la primera llamada a `subLoop`, desde `subLoop` sobreescribe el valor global de `i`. Usando `var` para el segundo bucle `for` se hace fácil evitar este error. La sentencia `var` no debe **nunca** dejarse a menos que -el *efecto deseado* es afectado por el ámbito exteriror. +el *efecto deseado* es afectado por el ámbito exterior. ### Variables locales diff --git a/doc/es/function/this.md b/doc/es/function/this.md index 65d0be5f..4fed1e35 100644 --- a/doc/es/function/this.md +++ b/doc/es/function/this.md @@ -63,7 +63,7 @@ mal diseño del lenguaje, ya que **nunca** tiene un uso práctico. // this es establecido como un objeto global } test(); - } + }; Un error común es que `this` dentro de `test` haga referencia a `Foo`, mientras que en realidad esto **no es así**. @@ -77,7 +77,7 @@ dentro del `método` para referirse a `Foo`. // Use that instead of this here } test(); - } + }; `that` es justo un nombre normal, pero es comúnmente usado para referenciar a `this` de forma externa. En combinación con [closures](#function.closures), esto puede ser diff --git a/doc/es/object/general.md b/doc/es/object/general.md index b06264ec..da48e138 100644 --- a/doc/es/object/general.md +++ b/doc/es/object/general.md @@ -91,7 +91,7 @@ Las propiedades de los objetos puede ser simbolizados como caracteres planos y c a otro mal diseño del parser de JavaScript, lo anterior es una excepción de `SyntaxError` antes de ECMAScript 5. -Este error se debe al `eliminar` una *keyword*; por lo tanto, debe ser +Este error se produce porque `delete` es una *keyword*; por lo tanto, debe ser anotado como un *string literal* para asegurarse que será interpretado correctamente por diversos motores de JavaScript. diff --git a/doc/es/object/prototype.md b/doc/es/object/prototype.md index 363c4d48..0461d1ff 100644 --- a/doc/es/object/prototype.md +++ b/doc/es/object/prototype.md @@ -41,7 +41,7 @@ llamadas de *cadenas de prototipo* (*prototype chains*). // Resultado de cadena de prototipos (prototype chain) test [instance of Bar] Bar.prototype [instance of Foo] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/fi/function/this.md b/doc/fi/function/this.md index 3ebf0a7b..3e2b09d2 100644 --- a/doc/fi/function/this.md +++ b/doc/fi/function/this.md @@ -51,7 +51,7 @@ Useimmat näistä tapauksista ovat järkeviä. Ensimmäistä niistä tosin voida // this asettuu globaaliin olioon } test(); - } + }; Yleisesti luullaan, että test-funktion sisältämä `this` viittaa tässä tapauksessa `Foo`-olioon. Todellisuudessa se **ei** kuitenkaan tee näin. @@ -63,7 +63,7 @@ Jotta `Foo`-olioon voidaan päästä käsiksi `test`-funktion sisällä, tulee m // Käytä thatia thissin sijasta } test(); - } + }; `that` on normaali nimi, jota käytetään yleisesti viittaamaan ulompaan `this`-muuttujaan. [Sulkeumia](#function.closures) käytettäessä `this`-arvoa voidaan myös välittää edelleen. diff --git a/doc/fi/object/prototype.md b/doc/fi/object/prototype.md index 4ecdae89..f2497e05 100644 --- a/doc/fi/object/prototype.md +++ b/doc/fi/object/prototype.md @@ -31,7 +31,7 @@ Ensimmäinen suuri ero liittyy siihen, kuinka perintä toimii. JavaScriptissä s // Prototyyppiketju test [Bar-olio] Bar.prototype [Foo-olio] - { foo: 'Terve maailma' } + { foo: 'Terve maailma', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/fr/function/this.md b/doc/fr/function/this.md index 723c0255..aed2301c 100644 --- a/doc/fr/function/this.md +++ b/doc/fr/function/this.md @@ -52,7 +52,7 @@ Bien que la plupart de ces cas ont du sens, le premier cas peut être considér // this réfère à l'objet global } test(); - } + }; Une autre erreur souvent commise est que `this` l'intérieur de `test` se réfère à `foo`; ce qui n'est **pas** du tout le cas. @@ -64,7 +64,7 @@ Pour accéder à `foo` de l'intérieur de `test`, vous pouvez créer une variabl // Utilisez self au lieu de this ici } test(); - } + }; `self` est juste une variable normale, couramment utilisée pour référencer un `this` extérieur. Combiné avec des [fermetures](# function.closures) "closures", on peut l'utiliser pour passer les valeurs de `this`. @@ -75,7 +75,7 @@ Pour accéder à `foo` de l'intérieur de `test`, vous pouvez créer une variabl // maintenant, this réfère à Foo }.bind(this); test(); - } + }; ### Assignement de méthodes diff --git a/doc/fr/object/prototype.md b/doc/fr/object/prototype.md index 50b21f23..c1a471aa 100644 --- a/doc/fr/object/prototype.md +++ b/doc/fr/object/prototype.md @@ -33,7 +33,7 @@ La première différence majeure est que l'héritage en JavaScript utilise des * // La chaîne de prototypes qui en résulte test [instance of Bar] Bar.prototype [instance of Foo] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/hu/array/constructor.md b/doc/hu/array/constructor.md index 444644a0..57a5a9ca 100644 --- a/doc/hu/array/constructor.md +++ b/doc/hu/array/constructor.md @@ -10,7 +10,7 @@ ajánlott mindig a tömb literált - `[]` jelölés - használni új tömbök l new Array(3); // Eredmény: [] new Array('3') // Eredmény: ['3'] -Abban az esetben, hogyha ez a konstruktor csak egy `szám` paramétert kap, akkor +Abban az esetben, ha ez a konstruktor csak egy `szám` paramétert kap, akkor visszatérési értékül egy olyan tömböt fog létrehozni amelynek a `length` mezője akkorára van beállítva, ahogy azt megadtuk az argumentumban. Megjegyzendő hogy **csak** a `length` tulajdonság lesz ekkor beállítva; az egyes indexek külön-külön diff --git a/doc/hu/array/general.md b/doc/hu/array/general.md index 660bb3b3..f7fa98e4 100644 --- a/doc/hu/array/general.md +++ b/doc/hu/array/general.md @@ -13,7 +13,7 @@ lassabb mint egy sima `for` ciklus. ### Iteráció -Annak érdekébern hogy a legjobb teljesítményt érjük el a tömbökön való iteráció során, +Annak érdekében, hogy a legjobb teljesítményt érjük el a tömbökön való iteráció során, a legjobb hogyha a klasszikus `for` ciklust használjuk. var list = [1, 2, 3, 4, 5, ...... 100000000]; @@ -27,7 +27,7 @@ a `l = list.length` kifejezés használatával. Habár a `length` tulajdonság mindig magán a tömbön van definiálva, még mindig lehet egy kis teljesítmény kiesés amiatt hogy minden iterációban újra meg kell keresni ezt a tulajdonságot. Persze a legújabb JavaScript motorok **talán** -használnak erre optimalizációt, de nem lehet biztosan megmondani hogy ahol a kódunk +használnak erre optimalizációt, de nem lehet biztosan megmondani, hogy ahol a kódunk futni fog, az egy ilyen motor-e vagy sem. Valójában, a cachelés kihagyása azt eredményezheti, hogy a ciklusunk csak diff --git a/doc/hu/core/delete.md b/doc/hu/core/delete.md index 859a3537..89b95b41 100644 --- a/doc/hu/core/delete.md +++ b/doc/hu/core/delete.md @@ -41,7 +41,7 @@ Az expliciten beállított mezőket persze normálisan lehet törölni. obj.y; // undefined -A fenti példábna az `obj.x` és `obj.y` törölhető, mivel nincs `DontDelete` +A fenti példában az `obj.x` és `obj.y` törölhető, mivel nincs `DontDelete` attribútuma egyik mezőnek sem. Ezért működik az alábbi példa is. // működik, kivéve IE-ben @@ -52,7 +52,7 @@ attribútuma egyik mezőnek sem. Ezért működik az alábbi példa is. GLOBAL_OBJECT.a; // undefined Itt egy trükköt használunk az `a` törlésére. A [`this`](#function.this) itt -a Globális objektumra mutat, és expliciten bezetjük rajta az `a` változót, mint +a Globális objektumra mutat, és expliciten bevezetjük rajta az `a` változót, mint egy mezőjét, így törölni is tudjuk. Mint az szokás, a fenti kód egy kicsit bugos IE-ben (legalábbis 6-8-ig). @@ -88,4 +88,4 @@ meghatározva az ES aktuális verziójú specifikációjában, pl. a window) ### Összegzésképp A `delete` működése helyenként megjósolhatatlan, így biztonsággal csak olyan -objektumok mezőin használhatjuk amelyeket expliciten mi állítottunk be. \ No newline at end of file +objektumok mezőin használhatjuk, amelyeket expliciten mi állítottunk be. \ No newline at end of file diff --git a/doc/hu/core/eval.md b/doc/hu/core/eval.md index b2c83d45..9de5d3b3 100644 --- a/doc/hu/core/eval.md +++ b/doc/hu/core/eval.md @@ -44,6 +44,6 @@ nem megbízható/ismeretlen. ### Összegzésül Soha ne használjunk `eval`t. Bármilyen kód működése, teljesítménye, ill. biztonsága -megkérdőjelezhető amely használja ezt a nyelvi elemet. Semmilyen megoldás +megkérdőjelezhető, amely használja ezt a nyelvi elemet. Semmilyen megoldás használata **nem ajánlott** amely első sorban `eval`ra épül. Ekkor egy *jobb megoldás* szükségeltetik, amely nem függ az `eval`tól. \ No newline at end of file diff --git a/doc/hu/core/semicolon.md b/doc/hu/core/semicolon.md index 0241234f..fddd1acf 100644 --- a/doc/hu/core/semicolon.md +++ b/doc/hu/core/semicolon.md @@ -93,7 +93,7 @@ Az értelmező drasztikusan megváltoztatta a fenti kódot. A legtöbb esetben a beillesztő **rosszul** tippel. (A ford.: Semmilyen nyelvben sem jó, hogyha hagyjuk hogy a gép találja ki mit -szerettünk volna írni. Néma gyereknek az anyja sem érti a kódját ugye) +szerettünk volna írni. Néma gyereknek az anyja sem érti a kódját ugye.) ### Kezdő Zárójelek diff --git a/doc/hu/function/arguments.md b/doc/hu/function/arguments.md index d7b77ec0..0a0a1e6f 100644 --- a/doc/hu/function/arguments.md +++ b/doc/hu/function/arguments.md @@ -22,12 +22,12 @@ Ez a kódrészlet egy új `Array` objektummá varázsolja az emlegetett `argumen Array.prototype.slice.call(arguments); -De, ez a konverzió meglehetősen **lassú** így egyáltalán **nem ajánlott** teljesítmény kirtikus +De, ez a konverzió meglehetősen **lassú**, így egyáltalán **nem ajánlott** teljesítmény kirtikus alkalmazások írásakor. ### Argumentumok kezelése -A következő módszer ajánlott arra az esetre hogyha az egyik függvény paramétereit egy-az-egyben +A következő módszer ajánlott arra az esetre, hogy ha az egyik függvény paramétereit egy-az-egyben át szeretnénk adni egy másik függvény számára. function foo() { @@ -37,7 +37,7 @@ A következő módszer ajánlott arra az esetre hogyha az egyik függvény param // sok okos kód ide } -Egy másik trükk arra hogy teljesen független wrapper függvényeket gyártsunk, a `call` +Egy másik trükk arra, hogy teljesen független wrapper függvényeket gyártsunk, a `call` és `apply` együttes használata. function Foo() {} @@ -83,7 +83,7 @@ egyik paraméterének ezt a nevet választjuk. Azonban a *getterek* és *setterek* mindig létrejönnek, de ez ne zavarjon meg minket, mert semmiféle befolyása nincs a teljesítményre, pláne olyan kódban ahol sokkal több mindennel -is foglalkozunk mint az `arguments` objetkumhoz való hozzáférés. +is foglalkozunk, mint az `arguments` objetkumhoz való hozzáférés. > **ES5 Megjegyzés:** Ezek a **getterek** és **setterek** nem jönnek létre strict módban. diff --git a/doc/hu/function/closures.md b/doc/hu/function/closures.md index 436f58e2..33d4e3bd 100644 --- a/doc/hu/function/closures.md +++ b/doc/hu/function/closures.md @@ -3,7 +3,7 @@ A JavaScript nyelv egyik legerőteljesebb tulajdonsága a *closure*-ök használatában rejlik. Ezek használatával a hatókörök egymásba ágyazhatóak, és egy belső hatókör mindig hozzáfér az őt körülvevő, külső hatókör változóihoz. Miután JavaScriptben egyetlen dologgal lehet -hatóköröket kifejezni, és ez a [funkció](#function.scopes) (bizony az if, try/catch és hasonló blokkok **nem** jelentenek új hatókört, mint pl. a Javaban), az összes funkció closure-ként szerepel. +hatóköröket kifejezni, és ez a [függvény](#function.scopes) (bizony az if, try/catch és hasonló blokkok **nem** jelentenek új hatókört, mint pl. a Javaban), az összes funkció closure-ként szerepel. ### Privát változók emulálása @@ -25,7 +25,7 @@ hatóköröket kifejezni, és ez a [funkció](#function.scopes) (bizony az if, t foo.get(); // 5 Ebben a példában a `Counter` **két** closure-rel tér vissza: az `increment` és -a `get` funkcióval. Mind a két funkció **referenciát** tárol a `Counter` hatókörre, +a `get` függvénnyel. Mind a két függvény **referenciát** tárol a `Counter` hatókörre, és így mindketten hozzáférnek a `count` változóhoz, ami ebben a hatókörben lett definiálva. @@ -46,7 +46,7 @@ létre fogja hozni, vagy felül fogja írni a *globális* `count` változót (wi ### Closure-ök használata ciklusokban -Az egyik leggyakoribb hiba amit el lehet követni, az a closure-ök ciklusokban való használata. +Az egyik leggyakoribb hiba, amit el lehet követni, az a closure-ök ciklusokban való használata. Annak is azon speciális esete amikor a ciklus indexváltozóját szeretnénk lemásolni a closure-ön belül. for(var i = 0; i < 10; i++) { @@ -82,7 +82,7 @@ függvénnyel](#function.scopes). A külső (wrapper) névtelen függvény így azonnal meghívódik az `i` ciklusváltozóval, mint paraméterrel, és így mindig egy másolatot fog kapni az `i` változó **értékéről**, amit ő `e` néven emészt tovább. -Így a `setTimeout`ban lévő névtelen fgv. mindig az `e` nevű referenciára fog mutatni, aminek az értéke így már **nem** változik meg a ciklus futása során. +Így a `setTimeout`ban lévő névtelen függvény mindig az `e` nevű referenciára fog mutatni, aminek az értéke így már **nem** változik meg a ciklus futása során. Egy másik lehetséges út a megoldáshoz az, hogy egy wrapper függvényt visszatérítünk a setTimeoutból, aminek ugyanaz lesz a hatása, mint a fentebbi példának. diff --git a/doc/hu/function/constructors.md b/doc/hu/function/constructors.md index e48e0b60..c955cce1 100644 --- a/doc/hu/function/constructors.md +++ b/doc/hu/function/constructors.md @@ -1,6 +1,6 @@ ## Konstruktorok -Csak úgy mint minden más, a konstruktorok működése szintén különbözik +Csak úgy, mint minden más, a konstruktorok működése szintén különbözik a megszokottól. Itt minden függvényhívás amelyet a `new` kulcsszó előz meg, konstruktor hívásnak számít. @@ -19,7 +19,7 @@ Ha a konstruktor függvényben nincs `return` utasítás, akkor automatikusan a var test = new Foo(); -A fenti kódban a `Foo` függvényt mint konstruktort hívjuk meg, ami a test változóban +A fenti kódban a `Foo` függvényt, mint konstruktort hívjuk meg, ami a test változóban egy új objektumot fog eredményezni. Ennek az objektumnak a `prototípusa` a Foo prototípusa lesz. Trükkös ugyan, de ha mégis van `return` utasítás az éppen konstruált függvényben, akkor @@ -47,12 +47,12 @@ Hogyha kihagyjuk a `new` kulcsszó használatát, a függvény **nem** egy új o } Foo(); // undefined -A [`this`](#function.this) JavaScript beli működésének köszönhetően, mégha le is +A [`this`](#function.this) JavaScript beli működésének köszönhetően, még ha le is fut az előbbi kód, akkor a `this` helyére a *globális objektumot* képzeljük. ### Gyárak (Factory-k) -Ahhoz, hogy teljesen eltudjuk hagyni a `new` kulcsszó használatát, a konstruktor +Ahhoz, hogy teljesen el tudjuk hagyni a `new` kulcsszó használatát, a konstruktor függvény explicit értékkel kell visszatérjen. function Bar() { diff --git a/doc/hu/function/general.md b/doc/hu/function/general.md index 4392060e..9b62b0ee 100644 --- a/doc/hu/function/general.md +++ b/doc/hu/function/general.md @@ -1,7 +1,7 @@ ## Függvény deklarációk és kifejezések A függvények JavaScriptben egyben objektumok is. Ez azt jelenti, hogy -ugyanúgy lehet őket passzolgatni mint bármelyik más értékeket. Ezt a featuret +ugyanúgy lehet őket passzolgatni, mint bármelyik más értékeket. Ezt a featuret gyakran használják arra, hogy egy *névtelen (callback) függvényt* átadjunk egy másik -aszinkron- függvény paramétereként. @@ -9,7 +9,7 @@ egy másik -aszinkron- függvény paramétereként. function foo() {} -Ez a függvény felkerül a scope tetejére ([hoisting](#function.scopes)), mielőtt a kód végrehajtása megtörténne. Így abban a scopeban ahol *definiálták*, *mindenhol* elérhető, +Ez a függvény felkerül a scope tetejére ([hoisting](#function.scopes)), mielőtt a kód végrehajtása megtörténne. Így abban a scope-ban, ahol *definiálták*, *mindenhol* elérhető, még abban a trükkös esetben is, hogyha a kód azon pontján hívjuk ezt a függvényt, mielőtt definiáltuk volna (látszólag). @@ -30,7 +30,7 @@ Habár ebben a példában a `var` deklaráció futás előtt a kód tetejére k ettől függetlenül a foo mint függvény meghívásakor hibát fogunk kapni. Ugyanis a deklaráció felkúszott, azonban az értékadás csak futásidőben fog megtörténni, -addig is a foo változó értéke [undefined](#core.undefined) marad. Az undefinedet pedig hiába hívjuk függvényként, TypeErrort kapunk végeredményül. +addig is a foo változó értéke [undefined](#core.undefined) marad. Az undefinedot pedig hiába hívjuk függvényként, TypeErrort kapunk végeredményül. ### Névvel ellátott függvény kifejezés @@ -41,7 +41,7 @@ Egy másik érdekes eset, amikor névvel ellátott függvényeket adunk érték } bar(); // ReferenceError -Ebben a példában a `bar`t önmagában nem lehet elérni egy külső scopeból (utolsó sor), +Ebben a példában a `bar`t önmagában nem lehet elérni egy külső scope-ból (utolsó sor), mivel egyből értékül adtuk a `foo` változónak. Ennek ellenére a `bar`on belül elérhető a `bar` név. A tanulság az, hogy a függvény önmagát *mindig* eléri a saját scopeján belül, és ez a JavaScriptben található [névfeloldásnak](#function.scopes) köszönhető. diff --git a/doc/hu/function/scopes.md b/doc/hu/function/scopes.md index 71c99902..7e75a0b5 100644 --- a/doc/hu/function/scopes.md +++ b/doc/hu/function/scopes.md @@ -214,8 +214,8 @@ ahhoz hogy meghívhatóak legyenek, először ki kell értékelni őket. ) // a függvény objektum visszatérítése () // az eredmény meghívása -Persze más kifejezések is használhatóak arra hogy kiértékeljük és meghívjuk -a függvény kifejezést, amelyek habár szintaxisukban eltérnek, ugyanazt eredményezik. +Persze más kifejezések is használhatóak arra, hogy kiértékeljük és meghívjuk +a függvény kifejezést, amelyek habár szintaxisukban eltérnek, ugyan azt eredményezik. // Még több stílus anonymus függvények azonnali hívásához... !function(){}() diff --git a/doc/hu/function/this.md b/doc/hu/function/this.md index 938385f4..8c363873 100644 --- a/doc/hu/function/this.md +++ b/doc/hu/function/this.md @@ -1,20 +1,20 @@ ## A `this` mágikus működése -A `this` kicsit másképp működik a JavaScriptben mint ahogy azt megszokhattuk -más nyelvekben. Ugyanis pontosan **ötféle** módja lehet annak hogy a `this` +A `this` kicsit másképp működik a JavaScriptben, mint ahogy azt megszokhattuk +más nyelvekben. Ugyanis pontosan **öt féle** módja lehet annak, hogy a `this` éppen mire utal a nyelvben. ### A Globális hatókör this; -Amikor globális hatókörben van használva a this, akkor pontosan a *globális* objektumra utal. +Amikor globális hatókörben van használva a `this`, akkor pontosan a *globális* objektumra utal. ### Függvény híváskor foo(); -Itt, a `this` megint a *globális* objektumra fog utalni. +Itt a `this` megint a *globális* objektumra fog utalni. > **ES5 Megjegyzés:** Strict módban a globális eset **nem létezik** többé. > Ezekben az esetekben a `this` értéke undefined lesz. @@ -40,7 +40,7 @@ az *újonnan létrehozott* `Objektumra` fog hivatkozni. foo.apply(bar, [1, 2, 3]); // ugyanaz mint egy sorral lejjebb foo.call(bar, 1, 2, 3); // argumentumok: a = 1, b = 2, c = 3 -A `Function.prototype`-ban levő `call` vagy `apply` használatakor aztán elszabadul a pokol :). +A `Function.prototype`-ban levő `call` vagy `apply` használatakor aztán elszabadul a pokol 😀. Ezekben az esetekben ugyanis a this a foo hívásakor **egzaktan** be lesz állítva az apply/call első argumentumára. @@ -63,7 +63,7 @@ praktikus felhasználási módja. // A this itt a globális ojjektum. } test(); - } + }; Gyakori hiba, hogy úgy gondolják a fenti példában az emberek, hogy a `this` a `test` függvényen belül az őt körülvevő `Foo`-ra fog mutatni, pedig **nem**. @@ -77,11 +77,11 @@ lokálisan elhelyezni a `method`-on belül, ami már valóban a kívánt `this`- // Használjuk a that-et a this helyett } test(); - } + }; A `that` tuladjonképpen egy mezei változónév (nem kulcsszó), de sokszor használják arra, -hogy egy másik `this`-re hivatkozzanak vele. A [colsureökkel](#function.closures) kombinálva -ez a módszer arra is használható hogy `this`-eket passzolgassunk a vakvilágban és mégtovább. +hogy egy másik `this`-re hivatkozzanak vele. A [closure-ökkel](#function.closures) kombinálva +ez a módszer arra is használható, hogy `this`-eket passzolgassunk a vakvilágban és még tovább. ### Eljárások értékül adása @@ -107,4 +107,4 @@ ami a nyelv egyik fő erőssége. new Bar().method(); Amikor a `method` meghívódik a `Bar` példányaként, a `this` pontosan a `Bar` -megfelelő példányára fog mutatni. \ No newline at end of file +megfelelő példányára fog mutatni. diff --git a/doc/hu/intro/index.md b/doc/hu/intro/index.md index 911baf61..83bb9b94 100644 --- a/doc/hu/intro/index.md +++ b/doc/hu/intro/index.md @@ -2,7 +2,7 @@ A **JavaScript Garden** egy folytonosan növekvő kódgyűjtemény amely a nyelv kihívást okozó részeit hivatott tisztázni. Itt tanácsokat kaphatsz afelől, hogyan kerüld el a leggyakoribb programozási- valamint nyelvi hibákat, hogyan írj gyorsabb kódot, és mik a legsűrűbben elkövetett *bad practice*k amelyekkel egy átlagos JavaScript programozó (nem) mindennapi útján találkozhat a nyelv megismerése közben. -A JavaScript Gardennek **nem** célja hogy megtanítsa a JavaScript nyelvet! +A JavaScript Gardennek **nem** célja, hogy megtanítsa a JavaScript nyelvet! Az itt felsorolt témák megértéséhez mindenképp szükséges némi tapasztalat. Ha a nyelv alapjait szeretnéd elsajátítani, először nézd át ezt a kiváló [tutorialt][1] a Mozilla Developer Networkön. ## Szerzők diff --git a/doc/hu/object/forinloop.md b/doc/hu/object/forinloop.md index b004e557..642dc265 100644 --- a/doc/hu/object/forinloop.md +++ b/doc/hu/object/forinloop.md @@ -1,13 +1,13 @@ ## A `for in` ciklus -Csak úgy mint a jó öreg `in` operátor, a `for in` is bejárja az egész +Csak úgy, mint a jó öreg `in` operátor, a `for in` is bejárja az egész prototípus láncot, amikor egy objektum mezőin próbálnánk iterálni. > **Megjegyzés:** A `for in` ciklus **nem** fog iterálni azokon a mezőkön, > amelyeknek az `enumerable` tulajdonsága `false`-ra van állítva. Például a > `length` mező nem kerül az iterációba amikor egy tömbön iterálnánk végig. - // Mérgezzük Object.prototypeot! + // Mérgezzük Object.prototype-ot! Object.prototype.bar = 1; var foo = {moo: 2}; @@ -32,10 +32,10 @@ lakó [`hasOwnProperty`](#object.hasownproperty) függvény használatával érh } } -Ez az egyetlen helyes útja annak hogy az objektum saját mezőin iteráljunk csak végig. +Ez az egyetlen helyes útja annak, hogy az objektum saját mezőin iteráljunk csak végig. Mivel a `hasOwnProperty`-t használjuk, így csak a várt `moo`-t fogja kiírni. Tehén jó kódunk van! Hogyha a `hasOwnProperty`-t kihagynánk, a kódunk ki lenne téve nem várt -hibáknak, amik pl. abból fakadnak hogy valaki ocsmányul kiterjesztette az +hibáknak, amik pl. abból fakadnak, hogy valaki ocsmányul kiterjesztette az `Object.prototype`-t. Például, ha a [Prototype][1] frameworköt használjuk, és nem ilyen stílusban írjuk a diff --git a/doc/hu/object/general.md b/doc/hu/object/general.md index 8f396de4..0032e735 100644 --- a/doc/hu/object/general.md +++ b/doc/hu/object/general.md @@ -1,8 +1,8 @@ ## Objektumok és mezők használata -A JavaSciprtben minden objektumként működik, a [`null`](#core.undefined) és az [`undefined`](#core.undefined) kivételével. +A JavaScriptben minden objektumként működik, a [`null`](#core.undefined) és az [`undefined`](#core.undefined) kivételével. - false.toString(); // 'hamis' + false.toString(); // 'false' [1, 2, 3].toString(); // '1,2,3' function Foo(){} @@ -47,11 +47,11 @@ Egy objektum mezői kétféle módon érhetőek el, vagy az 'objektum.mezőnév' foo.1234; // SyntaxError foo['1234']; // működik -A két jelölés majdnem egyenértékűen használható, kivéve, hogy a szögletes zárójelekkel dinamkusan állíthatunk be mezőket és olyan neveket is választhatunk, amik amúgy szintaxis hibához vezetnének (Fordító: mivel a neveket stringbe kell rakni, megadhatunk a JS által "lefoglalt" kulcsszavakat is mezőnévként, habár ennek használata erősen kerülendő). +A két jelölés majdnem egyenértékűen használható, kivéve, hogy a szögletes zárójelekkel dinamikusan állíthatunk be mezőket és olyan neveket is választhatunk, amik amúgy szintaxis hibához vezetnének (Fordító: mivel a neveket stringbe kell rakni, megadhatunk a JS által "lefoglalt" kulcsszavakat is mezőnévként, habár ennek használata erősen kerülendő). ### Mezők törlése -Egyetlen módon lehet mezőt törölni egy objektumból ez pedig a `delete` operátor +Egyetlen módon lehet mezőt törölni egy objektumból, ez pedig a `delete` operátor használata; a mező értékének `undefined`-ra vagy `null`-ra való állítása csak magára az értékre van kihatással, de a kulcs ugyanúgy megmarad az objektumban. @@ -84,7 +84,7 @@ Az objektumok mezőnevei mind stringként, mind egyszerű szövegként (Ford.: a leírhatóak. A JavaScript értelmező hibája miatt, a fenti kód azonban `SyntaxErrort` eredményez ECMAScript 5 előtti verzió esetén. Ez a hiba onnan ered, hogy a `delete` egy *kulcsszó*, viszont érdemes *string literálként* -leírni hogy helyesen megértsék a régebbi JavaScript motorok is. +leírni, hogy helyesen megértsék a régebbi JavaScript motorok is. [1]: http://en.wikipedia.org/wiki/Hashmap diff --git a/doc/hu/object/hasownproperty.md b/doc/hu/object/hasownproperty.md index 46d713e8..245a3287 100644 --- a/doc/hu/object/hasownproperty.md +++ b/doc/hu/object/hasownproperty.md @@ -1,8 +1,8 @@ ## `hasOwnProperty` -Hogy megtudjuk nézni egy adott objektum saját mezőit - azokat a mezőket amelyek +Hogy meg tudjuk nézni egy adott objektum saját mezőit - azokat a mezőket, amelyek az objektumon *közvetlenül* vannak definiálva, és nem valahol a -[prototípus láncon](#object.prototype) -, a `hasOwnProperty` függvényt használata +[prototípus láncon](#object.prototype) -, a `hasOwnProperty` függvény használata ajánlott, amelyet az összes objektum amúgy is örököl az `Object.prototype`-ból. > **Megj.:** Vicces programozók miatt, **nem** biztos hogy elég lesz megnézni hogy @@ -58,4 +58,4 @@ A `hasOwnProperty` használata az **egyetlen** megbízható módszer annak eldö hogy egy mező közvetlenül az objektumon lett-e létrehozva. Melegen ajánlott a `hasOwnProperty`-t **minden** [`for in` ciklusban](#object.forinloop) használni. Használatával ugyanis elkerülhetjük a kontár módon kiegészített natív prototípusokból -fakadó esetleges hibákat, amire példát az imént láttunk. \ No newline at end of file +fakadó esetleges hibákat, amire az imént láttunk példát. \ No newline at end of file diff --git a/doc/hu/object/prototype.md b/doc/hu/object/prototype.md index 2822188e..27a533b4 100644 --- a/doc/hu/object/prototype.md +++ b/doc/hu/object/prototype.md @@ -4,7 +4,7 @@ A JavaScript nem a klasszikus öröklődést használja, hanem egy ún. *protot származtatást használ. Míg ezt gyakran a JavaScript legnagyobb hibái között tartják számon, valójában -ez a származtatási modell jóval kifejezőbb mint klasszikus barátja. +ez a származtatási modell jóval kifejezőbb, mint klasszikus barátja. Ezt jelzi, hogy például sokkal könnyebb megépíteni a klasszikus modellt, alapul véve a prototípusos modellt, míg a fordított irány kivitelezése igencsak nehézkes lenne. @@ -40,7 +40,7 @@ használ. // A kapott prototípus lánc test [instance of Bar] Bar.prototype [instance of Foo] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype @@ -73,7 +73,7 @@ visszatérni. Alapjáraton, a JavaScript a prototype nevű mezőt használja a prototípus láncok kialakításához, de ettől függetlenül ez is ugyanolyan mező mint a többi, és -**bármilyen** értéket belehet neki állítani. Viszont a primitív típusokat egyszerűen +**bármilyen** értéket be lehet neki állítani. Viszont a primitív típusokat egyszerűen figyelmen kívül fogja hagyni a feldolgozó. function Foo() {} @@ -84,9 +84,9 @@ mezőkre és ezeknek az átállításával bele lehet szólni a prototípus lán ### Teljesítmény -Értelemszerűen, minnél nagyobb a prototípus lánc, annál tovább tart egy-egy mező +Értelemszerűen, minél nagyobb a prototípus lánc, annál tovább tart egy-egy mező felkeresése, és ez rossz hatással lehet a kód teljesítményére. Emellett, ha egy -olyan mezőt próbálunk elérni amely nincs az adott objektum példányban, az mindig +olyan mezőt próbálunk elérni, amely nincs az adott objektum példányban, az mindig a teljes lánc bejárását fogja eredményezni. Vigyázat! Akkor is bejárjuk a teljes láncot, amikor egy objektum mezőin próbálunk [iterálni](#object.forinloop). @@ -98,7 +98,7 @@ definiált prototípust próbálunk kiegészíteni új kóddal. Ezt [monkey patching][1]-nek is hívják, és aktívan kerülendő, mivel megtöri az *egységbe zárás* elvét. Habár ezt a technikát olyan népszerű framework-ök -is használják mint a [Prototype][2], ettől függetlenül ne hagyjuk magunkat csőbe húzni; +is használják, mint a [Prototype][2], ettől függetlenül ne hagyjuk magunkat csőbe húzni; nincs ésszerű indok arra, hogy összezavarjuk a beépített típusokat, további *nem standard* saját funkcionalitással. diff --git a/doc/hu/other/timeouts.md b/doc/hu/other/timeouts.md index 36c17e56..7ad37665 100644 --- a/doc/hu/other/timeouts.md +++ b/doc/hu/other/timeouts.md @@ -3,16 +3,16 @@ Mivel a JavaScript aszinkron, a `setTimeout` és `setInterval` használatával lehetséges késleltetni a kódok lefutási idejét. -> **Megjegyzés:** A timeout fv.-ek **nem** részei az ECMAScript Standardnek. +> **Megjegyzés:** A timeout függvények **nem** részei az ECMAScript Standardnek. > Mivel a [DOM][1] részeként lettek implementálva. function foo() {} var id = setTimeout(foo, 1000); // Egy számmal (> 0) tér vissza -Amikor a `setTimeout` függvényt meghívjuk, válaszul egy timeout ID-t kapunk +Amikor a `setTimeout` függvényt meghívjuk, válaszul egy timeout ID-t kapunk, valamint be lesz ütemezve a `foo` függvényhívás, hogy **körülbelül** 1000 miliszekundum múlva fusson le a jövőben. A `foo` **egyszer** lesz végrehajtva. -Az aktuális JavaScript motor időzítésétől függően, és annak figyelembe vételével +Az aktuális JavaScript motor időzítésétől függően, és annak figyelembe vételével, hogy a JavaScript mindig egyszálú, tehát a megelőző kódok blokkolhatják a szálat, **soha** nem lehet biztonságosan meghatározni hogy valóban a kért időzítéssel fog lefutni a kód amit megadtunk a `setTimeout`ban. Erre semmilyen biztosíték nincs. @@ -40,8 +40,8 @@ utal. ### Híváshalmozás a `setInterval`al -Míg a `setTimeout` csak egyszer futtatja le a megadott függvényt, a `setInterval` -- ahogy a neve is mutatja - **minden** `X` miliszekundumban végrehajtja a +Míg a `setTimeout` csak egyszer futtatja le a megadott függvényt, a `setInterval` - +ahogy a neve is mutatja - **minden** `X` miliszekundumban végrehajtja a neki átadott kódot, használata pedig erősen kerülendő. Nagy hátulütője, hogy még akkor is ütemezi az újabb és újabb @@ -62,7 +62,7 @@ futtatása először végzett. ### Hogyan Bánjunk El a Blokkolással -A legkönnyebb és kontrollálhatóbb megoldásnak az bizonyul, hogyha a `setTimeout` +A legkönnyebb és kontrollálhatóbb megoldásnak az bizonyul, ha a `setTimeout` függvényt a rögtön a foo-n belül használjuk. function foo(){ @@ -72,13 +72,13 @@ függvényt a rögtön a foo-n belül használjuk. foo(); Ez nem csak egységbe zárja a `setTimeout` hívást, de meggátolja a felesleges hívások -felhalmozását, és több irányítást ad a kezünkbe. A `foo` így magától eltudja +felhalmozását, és több irányítást ad a kezünkbe. A `foo` így magától el tudja dönteni, hogy akarja-e újra futtatni önmagát vagy sem. ### Timeout Tisztogatás Kézzel A `clearTimeout` vagy `clearInterval` hívással tudjuk a timeoutjainkat -megszüntetni, természetesen attól függ hogy melyiket használjuk, +megszüntetni, természetesen attól függ, hogy melyiket használjuk, hogy melyik `set` függvénnyel indítottuk útjára a timeoutunkat. var id = setTimeout(foo, 1000); @@ -94,7 +94,7 @@ hívás törlésére, ezért bruteforce módszerekhez kell folyamodjunk. clearTimeout(i); } -Persze ez csak véletlenszerű lövöldözés, semmi sem garantálja hogy a fenti +Persze ez csak véletlenszerű lövöldözés, semmi sem garantálja, hogy a fenti módszerrel nem marad timeout a rendszerben (A ford.: például az ezredik timeout vagy afelett). Szóval egy másik módszer ennek megoldására, hogy feltételezzük hogy minden `setTimeout` hívással az azonosítók száma egyel növekszik. @@ -106,8 +106,8 @@ minden `setTimeout` hívással az azonosítók száma egyel növekszik. clearTimeout(i); } -Habár ez a megoldás minden böngészőben megy (egyenlőre), ez az azonosítókról született mondás nincs specifikációban rögzítve, és ennek megfelelően változhat. -Az ajánlott módszer továbbra is az, hogy kövessük nyomon az összes timeout azonosítót amit generáltunk, és így ki is tudjuk őket rendesen törölni. +Habár ez a megoldás minden böngészőben megy (egyelőre), ez az azonosítókról született mondás nincs specifikációban rögzítve, és ennek megfelelően változhat. +Az ajánlott módszer továbbra is az, hogy kövessük nyomon az összes timeout azonosítót, amit generáltunk, és így ki is tudjuk őket rendesen törölni. ### `eval` A Színfalak Mögött @@ -158,7 +158,7 @@ a timeout függvények által meg lesz hívva a későbbiekben. **Soha** ne használjunk stringeket a `setTimeout` vagy `setInterval` első paramétereiként. Ha argumentumokat kell átadni a meghívandó függvénynek, az egyértelműen **rossz** kódra utal. Ebben az esetben a függvényhívás -lebonyolításához egy *anoním* függvény használata ajánlott. +lebonyolításához egy *anonim* függvény használata ajánlott. Továbbá, mivel az ütemező kódja nem blokkolódik a JavaScript futás által, a `setInterval` használata úgy általában kerülendő. diff --git a/doc/hu/types/casting.md b/doc/hu/types/casting.md index b5066ca5..ee604410 100644 --- a/doc/hu/types/casting.md +++ b/doc/hu/types/casting.md @@ -26,14 +26,14 @@ meglepetéseket. ### Natív típusok konstruktorai -A jó hír az, hogy a natív típusok mint a `Number` és a `String` különféle -módon viselkednek hogyha a `new` kulcsszóval avagy anélkül vannak inicializálva. +A jó hír az, hogy a natív típusok, mint a `Number` és a `String` különféle +módon viselkednek, hogy ha a `new` kulcsszóval avagy anélkül vannak inicializálva. new Number(10) === 10; // Hamis, Objektum vs. Szám Number(10) === 10; // Igaz, Szám vs. szám new Number(10) + 0 === 10; // Igaz, az implicit konverziónak hála -Ha egy natív típust mint a `Number` konstruktorként kezelünk, akkor egy új +Ha egy natív típust, mint a `Number` konstruktorként kezelünk, akkor egy új `Number` objektumot kapunk. De ha kihagyjuk a `new` kulcsszót akkor a `Number` egy egyszerű konverter függvényként fog viselkedni. diff --git a/doc/hu/types/equality.md b/doc/hu/types/equality.md index 0b503294..d627e86c 100644 --- a/doc/hu/types/equality.md +++ b/doc/hu/types/equality.md @@ -7,7 +7,7 @@ vizsgálatára Az egyenlőség vizsgálatot végző (egyik) operátort így jelöljük: `==` -A JavaScript egy *gyengén típusos* nyelv. Ez azt jelenti hogy az egyenlőség +A JavaScript egy *gyengén típusos* nyelv. Ez azt jelenti, hogy az egyenlőség operátor **típuskényszerítést** alkalmaz ahhoz, hogy össze tudjon hasonlítani két értéket. @@ -21,9 +21,9 @@ két értéket. null == undefined // igaz " \t\r\n" == 0 // igaz -A fenti táblázat szépen mutatja hogy mi a típuskényszerítés eredménye, és egyben +A fenti táblázat szépen mutatja, hogy mi a típuskényszerítés eredménye, és egyben azt is, hogy miért rossz szokás a `==` használata. Szokás szerint, ez megint -olyan fícsör ami nehezen követhető kódhoz vezethet a komplikált konverziós +olyan fícsör, ami nehezen követhető kódhoz vezethet a komplikált konverziós szabályai miatt. Pláne, hogy a kényszerítés teljesítmény problémákhoz is vezet; ugyanis, mielőtt @@ -34,7 +34,7 @@ a megfelelő típusra. Ez az operátor már **három** egyenlőségjelből áll: `===`. -Ugyanúgy működik mint az előbbi, kivéve hogy ez a változat **nem** alkalmaz +Ugyanúgy működik, mint az előbbi, kivéve hogy ez a változat **nem** alkalmaz típuskényszerítést az operandusai között. "" === "0" // hamis @@ -49,12 +49,12 @@ típuskényszerítést az operandusai között. A felső eredmények sokkal egyértelműbbek és ennek köszönhetően sokkal hamarabb eltörik a kód egy-egy ellenőrzésen. Ettől sokkal hibatűrőbb lesz -a produktumunk, és ráadásul teljesítménybeli gondjaink sem lesznek. +a produktumunk, ráadásul teljesítménybeli gondjaink sem lesznek. ### Objektumok összehasonlítása Habár mind a `==`-t és a `===`-t is egyenlőség operátornak hívjuk, eltérően -viselkednek hogyha legalább az egyik operandusuk egy objektum. +viselkednek, hogy ha legalább az egyik operandusuk egy objektum. {} === {}; // hamis new String('foo') === 'foo'; // hamis diff --git a/doc/hu/types/instanceof.md b/doc/hu/types/instanceof.md index 82f5942d..50dbd489 100644 --- a/doc/hu/types/instanceof.md +++ b/doc/hu/types/instanceof.md @@ -2,7 +2,7 @@ Az `instanceof` operátor a két operandusának konstruktorait hasonlítja össze. Csak akkor bizonyul hasznosnak, amikor saját készítésű objektumokon alkalmazzuk. -Beépített típusokon ugyanolyan hasztalan alkalmazni mint a [typeof operátort](#types.typeof). +Beépített típusokon ugyanolyan hasztalan alkalmazni, mint a [typeof operátort](#types.typeof). ### Saját objektumok összehasonlítása @@ -32,4 +32,4 @@ a böngészőn belül), mivel a konstruktoruk nem pontosan ugyanaz az objektum l ### Összegzésül -Az `instanceof`-ot tehát **csak** megegyező JS kontextusból származó, saját készítésű objektumoknál használjuk. Minden más felhasználása kerülendő, csak úgy mint a [`typeof`](#types.typeof) operátor esetén. \ No newline at end of file +Az `instanceof`-ot tehát **csak** megegyező JS kontextusból származó, saját készítésű objektumoknál használjuk. Minden más felhasználása kerülendő, csak úgy, mint a [`typeof`](#types.typeof) operátor esetén. \ No newline at end of file diff --git a/doc/hu/types/typeof.md b/doc/hu/types/typeof.md index b39070fd..556543dc 100644 --- a/doc/hu/types/typeof.md +++ b/doc/hu/types/typeof.md @@ -5,7 +5,7 @@ lehetőség szerint a JavaScript nyelv egyik legnagyobb buktatója, mivel majdne teljesen **rosszul működik**. Habár az `instanceof`-nak korlátozottan még lehet értelme, a `typeof` operátor -tényleg csak egyetlen praktikus use case-zel rendelkezik és ez **nem** az hogy egy +tényleg csak egyetlen praktikus use case-el rendelkezik és ez **nem** az, hogy egy objektum típusvizsgálatát elvégezzük. > **Megjegyzés:** Mivel a `typeof` vizsgálatot ravaszul úgy is le lehet írni, diff --git a/doc/it/function/this.md b/doc/it/function/this.md index 5bee4398..258086a3 100644 --- a/doc/it/function/this.md +++ b/doc/it/function/this.md @@ -66,7 +66,7 @@ uso pratico. // this viene impostato all'oggetto globale } test(); - } + }; Una comune credenza è che `this` all'interno di `test` faccia riferimento a `Foo` mentre, invece, **non** è così. @@ -80,7 +80,7 @@ una variabile locale all'interno di `method` che faccia riferimento a `Foo`. // Qui viene usato self invece di this } test(); - } + }; `self` è solo un normale nome di variabile, ma viene comunemente usato come riferimento ad un `this` più esterno. Abbinato alle [closures](#function.closures) @@ -94,7 +94,7 @@ con una funziona anonima // this ora fa riferimento a Foo }.bind(this); test(); - } + }; ### Metodi di asseganzione diff --git a/doc/it/object/prototype.md b/doc/it/object/prototype.md index 4c34fada..8f8111d1 100644 --- a/doc/it/object/prototype.md +++ b/doc/it/object/prototype.md @@ -43,7 +43,7 @@ La prima grande differenza è che l'ereditarietà in JavaScript utilizza le // La catena di prototipi finale test [istanza di Bar] Bar.prototype [istanza di Foo] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/ja/function/this.md b/doc/ja/function/this.md index 4e6e27aa..88a35390 100644 --- a/doc/ja/function/this.md +++ b/doc/ja/function/this.md @@ -55,7 +55,7 @@ JavaScriptの`this`と名付けられた特殊なキーワードは他のプロ // このファンクションはグローバルオブジェクトに設定される } test(); - } + }; 良くある誤解として`test`の中の`this`が`Foo`を参照しているというものがありますが、そのような事実は**一切**ありません。 @@ -67,7 +67,7 @@ JavaScriptの`this`と名付けられた特殊なキーワードは他のプロ // ここでthisの代わりに使用する } test(); - } + }; `that`は通常の変数名ですが、外部の`this`の参照の為に良く使われます。[クロージャ](#function.closures)と組み合わせる事で`this`の値を渡す事ができるようになります。 diff --git a/doc/ja/object/prototype.md b/doc/ja/object/prototype.md index 4a5ad300..a38ff3f5 100644 --- a/doc/ja/object/prototype.md +++ b/doc/ja/object/prototype.md @@ -33,7 +33,7 @@ JavaScriptはプロトタイプベースが採用されている唯一の広範 // プロトタイプチェーンの結果 test [instance of Bar] Bar.prototype [instance of Foo] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/ko/function/scopes.md b/doc/ko/function/scopes.md index 7792ee65..b94dc10e 100644 --- a/doc/ko/function/scopes.md +++ b/doc/ko/function/scopes.md @@ -1,4 +1,4 @@ - ## 스코프와 네임스페이스 +## 스코프와 네임스페이스 JavaScript는 '{}' Block이 배배 꼬여 있어도 문법적으로는 잘 처리하지만, Block Scope은 지원하지 않는다. 그래서 JavaScript에서는 항상 *함수 스코프*를 사용한다. diff --git a/doc/ko/function/this.md b/doc/ko/function/this.md index 019b4458..0ad51ad9 100644 --- a/doc/ko/function/this.md +++ b/doc/ko/function/this.md @@ -51,7 +51,7 @@ Global Scope에서도 this가 사용될 수 있고 이때에는 *Global* 객체 // 여기에서 this는 Global 객체를 가리킨다. } test(); - } + }; `test` 에서 `this`가 `Foo`를 가리킬 것으로 생각할 테지만 틀렸다. 실제로는 그렇지 않다. @@ -63,7 +63,7 @@ Global Scope에서도 this가 사용될 수 있고 이때에는 *Global* 객체 // 여기에서 this 대신에 self를 사용하여 Foo에 접근한다 } test(); - } + }; `self`는 통상적인 변수 이름이지만, 바깥쪽의 `this`를 참조하기 위해 일반적으로 사용된다. 또한 [클로저](#function.closures)와 결합하여 `this`의 값을 주고 받는 용도로 사용할 수도 있다. @@ -75,7 +75,7 @@ ECMAScript 5부터는 익명 함수와 결합된 `bind` 메소드를 사용하 // this는 이제 Foo를 참조한다 }.bind(this); test(); - } + }; ### Method 할당하기 diff --git a/doc/ko/object/prototype.md b/doc/ko/object/prototype.md index 9e8ffb2a..606d8105 100644 --- a/doc/ko/object/prototype.md +++ b/doc/ko/object/prototype.md @@ -31,7 +31,7 @@ Javascript는 클래스 스타일의 상속 모델을 사용하지 않고 *프 // 결과적으로 만들어진 프로토타입 체인은 다음과 같다. test [instance of Bar] Bar.prototype [instance of Foo] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/pl/function/this.md b/doc/pl/function/this.md index 3819cac7..adf7e1d0 100644 --- a/doc/pl/function/this.md +++ b/doc/pl/function/this.md @@ -63,7 +63,7 @@ w praktyce. // wewnątrz tej funkcji this wskazuje na obiekt global } test(); - } + }; Powszechnym błędem jest myślenie, że `this` wewnątrz `test` wskazuje na `Foo`, podczas gdy w rzeczywistości tak **nie jest**. @@ -77,7 +77,7 @@ metody lokalnej zmiennej, która będzie wskazywała na `Foo`. // Należy używać that zamiast this wewnątrz tej funkcji } test(); - } + }; `that` jest zwykłą zmienną, ale jest to powszechnie stosowana konwencja otrzymywania wartości zewnętrznego `this`. W połączeniu z [domknięciami(closures)](#function.closures), diff --git a/doc/pl/object/prototype.md b/doc/pl/object/prototype.md index 75884618..3cabc20e 100644 --- a/doc/pl/object/prototype.md +++ b/doc/pl/object/prototype.md @@ -41,7 +41,7 @@ tak zwanych *łańcuchów prototypów*. // The resulting prototype chain test [instance of Bar] Bar.prototype [instance of Foo] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/ptbr/core/eval.md b/doc/ptbr/core/eval.md index 0579953d..e7608cd9 100644 --- a/doc/ptbr/core/eval.md +++ b/doc/ptbr/core/eval.md @@ -11,8 +11,8 @@ A função `eval` executará uma string de código JavaScript no escopo local. test(); // 3 foo; // 1 -Entreranto, `eval` somente é executado no escopo local quando é chamado diretamente -*e* quanto o nome da função chamada é `eval`. +Entretanto, `eval` somente é executado no escopo local quando é chamado diretamente +*e* quando o nome da função chamada é `eval`. var foo = 1; function test() { @@ -40,6 +40,6 @@ Ele **nunca** deve ser utilizado com strings de origens duvidosas ou desconhecid ### Conclusão `eval` nunca deve ser utilizado. Qualquer código que faça uso de `eval` seve ser questionado -em sua utilizade, performance e segurança. Se algo necessita de `eval` para funcionar, então **não** deve ser utilizado. +em sua utilidade, performance e segurança. Se algo necessita de `eval` para funcionar, então **não** deve ser utilizado. Um *design melhor* deve ser utilizado, um que não faça uso de `eval`. diff --git a/doc/ptbr/core/semicolon.md b/doc/ptbr/core/semicolon.md index 38375017..843d7db4 100644 --- a/doc/ptbr/core/semicolon.md +++ b/doc/ptbr/core/semicolon.md @@ -2,7 +2,7 @@ Apesar do JavaScript possuir uma sintaxe no estilo C, o uso do ponto e vírgula **não** é obrigatório. -JavaScript não é uma linguagem 'semicolon-less'. De fato, o ponto e vírgula é necessário para o interpretação do código. Entretanto, o parser do JavaScript insere o **automaticamente** ponto e vírgula sempre que ocorrer um error de parser, decorrente da falta do ponto e vírgula. +JavaScript não é uma linguagem 'semicolon-less'. De fato, o ponto e vírgula é necessário para o interpretação do código. Entretanto, o parser do JavaScript insere o **ponto e vírgula** automaticamente sempre que ocorrer um error de parser, decorrente da falta do ponto e vírgula. var foo = function() { } // parse error, semicolon expected @@ -96,11 +96,5 @@ As chances de `log` não retornar uma função são **muito** altas; portanto, o ### Conclusão -It is highly recommended to **never** omit semicolons. It is also recommended -that braces be kept on the same line as their corresponding statements and to -never omit them for single-line `if` / `else` statements. These measures will -not only improve the consistency of the code, but they will also prevent the -JavaScript parser from changing code behavior. - É **fortemente** recomendado que nunca se omita o ponto e vírgula. Também é recomendado que chaves sejam mantidas na mesma linha que seus statements e que nunca sejam omitadas em declações de uma só linha como `if` / `else` statements. Tais medidas não somente melhorarão a consistência do código, como também irão previnir alteração no comportamento do código por má interpretação do parser do JavaScript. diff --git a/doc/ptbr/core/undefined.md b/doc/ptbr/core/undefined.md index 463a9618..cbaedcc6 100644 --- a/doc/ptbr/core/undefined.md +++ b/doc/ptbr/core/undefined.md @@ -28,10 +28,10 @@ Aqui estão alguns exemplos de quando o valor `undefined` é retornado: ### Manipulando mudanças no valor de `undefined` -Uma que a variável global `undefined` apenas mantém uma cópia do valor *atual* de `undefined`, atribuir-lhe +Uma vez que a variável global `undefined` apenas mantém uma cópia do valor *atual* de `undefined`, atribuir-lhe um novo valor **não** muda o valor do tipo `undefined`. -Ainda, a fim de comparar alguma coisa com o valor de `undefined`, é ncessário que +Ainda, a fim de comparar alguma coisa com o valor de `undefined`, é necessário que primeiro se retorne o `undefined`. A fim de proteger o código contra uma possível sobrescrtia da variável `undefined`, uma @@ -54,7 +54,7 @@ Outra maneira de atingir o mesmo efeito seria utilizar uma declaração dentro d })('Hello World', 42); -A única diferença aqui é a que a última versão resulta na redução de 4 bytes, e nã existe +A única diferença aqui é a que a última versão resulta na redução de 4 bytes, e não existe outro `var` statement dentro do wrapper anônimo. ### Usos do `null` diff --git a/doc/ptbr/function/arguments.md b/doc/ptbr/function/arguments.md index 099ecf02..33c3214f 100644 --- a/doc/ptbr/function/arguments.md +++ b/doc/ptbr/function/arguments.md @@ -1,6 +1,6 @@ ## O objeto `arguments` -Todo escopo de uma função em JavaScript em acesso à variável especial `arguments`. +Todo escopo de uma função em JavaScript tem acesso à variável especial `arguments`. Esta variável armazena uma lista de todos os argumentos que foram passados para a função. > **Nota:** No caso em que `arguments` tenha sido definido dentro do escopo da função por meio @@ -12,7 +12,7 @@ e é de fato um `Object`. Devido a isto, **não** é possível usar os métodos padrões de array como `push`, `pop` ou `slice` no `arguments`. Enquanto que a iteração com um simples `for` loop funciona bem, -é necessário convertê-lo para um `Array` a fim de usar os métodos padrões de `Array`. +é necessário convertê-lo para um `Array` a fim de usar os métodos padrões de `Array`. ### Convertendo em um Array @@ -96,10 +96,7 @@ em engines modernas de JavaScript. Este caso é o uso de `arguments.callee` foo(); // Would normally be inlined... } } - -No código acima, `foo` -In the above code, `foo` can no longer be a subject to [inlining][1] since it -needs to know about both itself and its caller. + Isto não somente acaba com possíveis ganhos de performance que resultariam de inlining, mas também quebram o encapsulamento pois a função agora depende de uma chamada específica de contexto. diff --git a/doc/ptbr/function/this.md b/doc/ptbr/function/this.md index 6f8c45d9..daacb9a9 100644 --- a/doc/ptbr/function/this.md +++ b/doc/ptbr/function/this.md @@ -61,7 +61,7 @@ como um engano de concepção da linguagem, já que **nunca** se mostrou útil. // this referencia o objeto global } test(); - } + }; Um erro comum é achar que `this` dentro de `test` referencia `Foo`; enquanto que, na realidade **não é isto que acontece**. @@ -75,7 +75,7 @@ uma variável global dentro do método para se referir à `Foo`. // Utilize that no lugar de this aqui } test(); - } + }; `that` trata-se de uma variável normal, porém é normalmente utilizada para referências externas de `this`. Quando combinadas com [closures](#function.closures), também podem ser utilizadas para repassar `this` como valor. diff --git a/doc/ptbr/object/general.md b/doc/ptbr/object/general.md index a5e88626..12452e7f 100644 --- a/doc/ptbr/object/general.md +++ b/doc/ptbr/object/general.md @@ -14,7 +14,7 @@ Um equívoco muito comum é a idéia de que números não podem ser manipulados 2.toString(); // raises SyntaxError -Existem duas soluções para contornar este problema e permtir que números se comportem como objetos. +Existem três soluções para contornar este problema e permtir que números se comportem como objetos. 2..toString(); // o segundo ponto é reconhecido corretamente 2 .toString(); // perceba o espaço deixado à esquerda do ponto diff --git a/doc/ptbr/object/hasownproperty.md b/doc/ptbr/object/hasownproperty.md index 2ff0589f..858e052c 100644 --- a/doc/ptbr/object/hasownproperty.md +++ b/doc/ptbr/object/hasownproperty.md @@ -27,7 +27,7 @@ em outro lugar na cadeia prototype. ### `hasOwnProperty` como propriedade -JavaScript não protege o nome do propriedade `hasOwnProperty`; assim, se +JavaScript não protege o nome da propriedade `hasOwnProperty`; assim, se existe a possibilidade de algum objeto possuir uma propriedade com este mesmo nome, torna-se necessário utilizar um `hasOwnProperty` **externo** a fim de obter resultados corretos. @@ -50,7 +50,7 @@ torna-se necessário utilizar um `hasOwnProperty` **externo** a fim de obter res ### Conclusão -O método é a **única** maneira confiável `hasOwnProperty` para verificar a existência da propriedade em um objeto. +O método `hasOwnProperty` é a **única** maneira confiável para verificar a existência da propriedade em um objeto. É recomendado que `hasOwnProperty` seja utilizado em **cada** interação de um [laço `for in`](#object.forinloop) a fim de evitar erros de extensão do [prototype](#object.prototype). diff --git a/doc/ptbr/object/prototype.md b/doc/ptbr/object/prototype.md index a44bb25e..c9411640 100644 --- a/doc/ptbr/object/prototype.md +++ b/doc/ptbr/object/prototype.md @@ -37,7 +37,7 @@ A primeira grande diferença é que herança em JavaScript utiliza o conceito de // A cadeia prototype resultante test [instance of Bar] Bar.prototype [instance of Foo] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/ptbr/other/timeouts.md b/doc/ptbr/other/timeouts.md index 8d522c4e..74ec2081 100644 --- a/doc/ptbr/other/timeouts.md +++ b/doc/ptbr/other/timeouts.md @@ -13,7 +13,7 @@ Quando `setTimeout` é chamado, ele retorna o ID do timeout e agenda a execuçã para **aproximadamente** mil milissegundos no futuro. `foo` será executado uma **única** vez. -Dependendo de como a enine JavaScript que está rodando o código resolve o timer, bem como +Dependendo de como a engine JavaScript que está rodando o código resolve o timer, bem como o fato de que o JavaScript é single threaded e outro código que é executado pode bloquear a thread, **não há como** garantir a precisão dos intervalos especificados nas chamadas `setTimeout`. @@ -44,7 +44,7 @@ o nome sugere - irá executar a função a **cada** `X` milisegundos, porém se desencorajado. Quando um código em execução bloqueia a chamada do timeout, `setInterval` continuará -emitindo chamads para a função em questão. Isto pode, especialmente com intervalos curtos, +emitindo chamadas para a função em questão. Isto pode, especialmente com intervalos curtos, resultar em uma pilha de chamadas de função. function foo(){ @@ -129,7 +129,7 @@ Esta funcionalidade **nunca** deve ser utilizada pois internamente faz uso de `e Uma vez que `eval` não é chamado [diretamente](#core.eval) neste caso, a string passada como argumento para `setTimeout` será executada no *escopo global*; assim, ela -não usará a variávle local `foo` do escopo de `bar`. +não usará a variável local `foo` do escopo de `bar`. Também é recomendado **não** usar uma string para passar argumentos para a função que será chamada por qualquer uma das funções de timeout. diff --git a/doc/ru/function/constructors.md b/doc/ru/function/constructors.md index 33f62bf2..7a322aff 100644 --- a/doc/ru/function/constructors.md +++ b/doc/ru/function/constructors.md @@ -70,7 +70,7 @@ ### Создание объектов с использованием фабрик -Часто рекомендуют **не** использовать `new`, поскольку если вы его забудете, это может привести к ошибкам. +Часто **не** рекомендуют использовать `new`, поскольку если вы его забудете, это может привести к ошибкам. Чтобы создать новый объект, лучше использовать фабрику и создать новый объект *внутри* этой фабрики. @@ -89,13 +89,13 @@ return obj; } -Хотя данный пример и сработает, если вы забыли ключевое слово `new` и благодаря ему легче работать с [приватными переменными](#function.closures), у него есть несколько недостатков +Хотя данный пример и сработает, если вы забыли ключевое слово `new`, и благодаря ему легче работать с [приватными переменными](#function.closures), у него есть несколько недостатков 1. Он использует больше памяти, поскольку созданные объекты **не** хранят методы в прототипе и соответственно для каждого нового объекта создаётся копия каждого метода. 2. Чтобы эмулировать наследование, фабрике нужно скопировать все методы из другого объекта или установить прототипом нового объекта старый. - 3. Разрыв цепочки прототипов просто по причине забытого ключевого слова `new` идёт в разрез с духом языка. + 3. Разрыв цепочки прототипов просто по причине забытого ключевого слова `new` идёт вразрез с духом языка. ### Заключение -Хотя забытое ключевое слово `new` и может привести к багам, это точно **не** причина отказываться от использования прототипов. В конце концов, полезнее решить какой из способов лучше совпадает с требованиями приложения: очень важно выбрать один из стилей создания объектов и после этого **не изменять** ему. +Хотя забытое ключевое слово `new` и может привести к багам, это точно **не** причина отказываться от использования прототипов. В конце концов, полезнее решить, какой из способов лучше совпадает с требованиями приложения: очень важно выбрать один из стилей создания объектов и после этого **не изменять** ему. diff --git a/doc/ru/function/scopes.md b/doc/ru/function/scopes.md index 8883e3f7..0cf88caa 100644 --- a/doc/ru/function/scopes.md +++ b/doc/ru/function/scopes.md @@ -73,9 +73,9 @@ В то время как `foo` и `i` — локальные переменные в области видимости функции `test`, присвоение `bar` переопределит значение одноимённой глобальной переменной. -### Высасывание +### Всплытие -JavaScript **высасывает** определения. Это значит, что оба определения с использованием `var` и определение `function` будут перенесены наверх заключающей их области видимости. +В JavaScript действует механизм **всплытия** определения. Это значит, что оба определения с использованием `var` и определение `function` будут перенесены наверх заключающей их области видимости. bar(); var bar = function() {}; @@ -116,16 +116,16 @@ JavaScript **высасывает** определения. Это значит, bar(); // вылетает с ошибкой TypeError, // поскольку bar всё ещё 'undefined' - someValue = 42; // присвоения не подвержены высасыванию + someValue = 42; // присвоения не подвержены всплытию bar = function() {}; test(); Потерянная область видимости блока не только переместит операторы `var` вовне циклов и их тел, но и сделает результаты некоторых конструкций с `if` неинтуитивными. -В исходном коде оператор `if` изменял *глобальную переменную* `goo`, когда, как оказалось, он изменяет *локальную переменную* — в результате работы высасывания. +В исходном коде оператор `if` изменял *глобальную переменную* `goo`, когда, как оказалось, он изменяет *локальную переменную* — в результате работы всплытия. -Если вы не знакомы с *высасываниями*, то можете посчитать, что нижеприведённый код должен породить +Если вы не знакомы со *всплытием*, то можете посчитать, что нижеприведённый код должен породить `ReferenceError`. // проверить, проинициализована ли SomeImportantThing @@ -162,7 +162,7 @@ JavaScript **высасывает** определения. Это значит, ### Пространства имён -Нередкое последствие наличия только одного глобального пространства имён — проблемы с перекрытием имён переменных. В JavaScript эту проблему легко избежать, используя *анонимные обёртки*. +Нередкое последствие наличия только одного глобального пространства имён — проблема с перекрытием имён переменных. В JavaScript эту проблему легко избежать, используя *анонимные обёртки*. (function() { // самостоятельно созданное "пространство имён" diff --git a/doc/ru/function/this.md b/doc/ru/function/this.md index d50f9403..6883a546 100644 --- a/doc/ru/function/this.md +++ b/doc/ru/function/this.md @@ -51,7 +51,7 @@ // this ссылается на глобальный объект } test(); - } + }; Распространенным заблуждением будет то, что `this` внутри `test` ссылается на `Foo`, но это **не так**. @@ -63,7 +63,7 @@ // Здесь используем that вместо this } test(); - } + }; Подходящее имя для переменной - `that`, его часто используют для ссылки на внешний `this`. В комбинации с [замыканиями](#function.closures) `this` можно пробрасывать в глобальную область или в любой другой объект. diff --git a/doc/ru/object/prototype.md b/doc/ru/object/prototype.md index edc03efb..a8e75129 100644 --- a/doc/ru/object/prototype.md +++ b/doc/ru/object/prototype.md @@ -33,7 +33,7 @@ // Цепочка прототипов, которая получится в результате test [instance of Bar] Bar.prototype [instance of Foo] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/tr/function/scopes.md b/doc/tr/function/scopes.md index d826f1aa..211c45f7 100644 --- a/doc/tr/function/scopes.md +++ b/doc/tr/function/scopes.md @@ -178,7 +178,7 @@ adında bir özel değişken tanımlanmıştır, bu değişken *geçerli nesneyi Fonksiyon kapsamlarında aynı zamanda [`arguments`](#function.arguments) adında bir değişken tanımlanmıştır ve fonksiyonun argümanlarını içerir. -Örnek olarak bir fonksiyon kapsamında `foo` değişkenine eriğildiğinde JavaScript +Örnek olarak bir fonksiyon kapsamında `foo` değişkenine erişildiğinde JavaScript isim çözümlemeyi aşağıdaki sıra ile yapacaktır: 1. Geçerli kapsamda bir `var foo` ifadesi mevcutsa bu kullanılır. diff --git a/doc/tr/function/this.md b/doc/tr/function/this.md index de24190a..b589dc42 100644 --- a/doc/tr/function/this.md +++ b/doc/tr/function/this.md @@ -65,7 +65,7 @@ kullanılımı yoktur. // this genel nesneye işaret eder } test(); - } + }; Bir başka yanılgı `test` fonksiyonunun içinde `this` 'in `Foo` 'ya işaret edeceğinin sanılmasıdır, ama bu **doğru değildir**. @@ -79,7 +79,7 @@ değişken oluşturmaktır. // Burada this yerine that kullanın } test(); - } + }; `that` kelimesinin dilde özel bir anlamı yoktur, ama sıklıkla dış kapsamdaki `this` 'e işaret etmek için kullanılır. Bu yöntem [`closure`](#function.closures) diff --git a/doc/tr/object/prototype.md b/doc/tr/object/prototype.md index 1a2d09a1..d8b8522a 100644 --- a/doc/tr/object/prototype.md +++ b/doc/tr/object/prototype.md @@ -39,7 +39,7 @@ yapılmasıdır. // Sonuçta ortaya çıkan prototip zinciri test [bir Bar sınıfı nesnesi] Bar.prototype [bir Foo sınıfı nesnesi] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/zh/function/arguments.md b/doc/zh/function/arguments.md index 69c07fe5..ac6967eb 100755 --- a/doc/zh/function/arguments.md +++ b/doc/zh/function/arguments.md @@ -9,7 +9,7 @@ JavaScript 中每个函数内都能访问一个特别变量 `arguments`。这个 `arguments` 变量**不是**一个数组(`Array`)。 尽管在语法上它有数组相关的属性 `length`,但它不从 `Array.prototype` 继承,实际上它是一个对象(`Object`)。 -因此,无法对 `arguments` 变量使用标准的数组方法,比如 `push`, `pop` 或者 `slice`。 +因此,无法对 `arguments` 变量使用标准的数组方法,比如 `push`、`pop` 或者 `slice`。 虽然使用 `for` 循环遍历也是可以的,但是为了更好的使用数组方法,最好把它转化为一个真正的数组。 ###转化为数组 @@ -99,13 +99,13 @@ JavaScript 中每个函数内都能访问一个特别变量 `arguments`。这个 然而,的确有一种情况会显著的影响现代 JavaScript 引擎的性能。这就是使用 `arguments.callee`。 function foo() { - arguments.callee; // do something with this function object - arguments.callee.caller; // and the calling function object + arguments.callee; // 使用这个函数对象 + arguments.callee.caller; // 以及这个函数对象的调用者 } function bigLoop() { for(var i = 0; i < 100000; i++) { - foo(); // Would normally be inlined... + foo(); // 通常情况会作为内联函数... } } diff --git a/doc/zh/function/closures.md b/doc/zh/function/closures.md index 77f69e4c..df474a65 100755 --- a/doc/zh/function/closures.md +++ b/doc/zh/function/closures.md @@ -3,6 +3,8 @@ 闭包是 JavaScript 一个非常重要的特性,这意味着当前作用域**总是**能够访问外部作用域中的变量。 因为 [函数](#function.scopes) 是 JavaScript 中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数。 +> 译者注:ES2015 中增加了块级作用域。 + ###模拟私有变量 function Counter(start) { @@ -23,7 +25,7 @@ foo.get(); // 5 这里,`Counter` 函数返回两个闭包,函数 `increment` 和函数 `get`。 这两个函数都维持着 -对外部作用域 `Counter` 的引用,因此总可以访问此作用域内定义的变量 `count`. +对外部作用域 `Counter` 的引用,因此总可以访问此作用域内定义的变量 `count`。 ###为什么不可以在外部访问私有变量 @@ -44,13 +46,13 @@ for(var i = 0; i < 10; i++) { setTimeout(function() { - console.log(i); + console.log(i); }, 1000); } 上面的代码不会输出数字 `0` 到 `9`,而是会输出数字 `10` 十次。 -当 `console.log` 被调用的时候,*匿名*函数保持对外部变量 `i` 的引用,此时 `for`循环已经结束, `i` 的值被修改成了 `10`. +当 `console.log` 被调用的时候,*匿名*函数保持对外部变量 `i` 的引用,此时 `for`循环已经结束, `i` 的值被修改成了 `10`。 为了得到想要的结果,需要在每次循环中创建变量 `i` 的**拷贝**。 @@ -61,7 +63,7 @@ for(var i = 0; i < 10; i++) { (function(e) { setTimeout(function() { - console.log(e); + console.log(e); }, 1000); })(i); } @@ -76,8 +78,8 @@ setTimeout((function(e) { return function() { console.log(e); - } - })(i), 1000) + }; + })(i), 1000); } diff --git a/doc/zh/function/general.md b/doc/zh/function/general.md index 6269ee16..04414900 100755 --- a/doc/zh/function/general.md +++ b/doc/zh/function/general.md @@ -1,6 +1,6 @@ ##函数声明与表达式 -函数是JavaScript中的一等对象,这意味着可以把函数像其它值一样传递。 +函数是 JavaScript 中的一等对象,这意味着可以把函数像其它值一样传递。 一个常见的用法是把*匿名函数*作为回调函数传递到异步函数中。 ###函数声明 @@ -8,9 +8,9 @@ function foo() {} 上面的方法会在执行前被 [解析(hoisted)](#function.scopes),因此它存在于当前上下文的*任意*一个地方, -即使在函数定义体的上面被调用也是对的。 +即使在函数定义体的上面被调用也是对的。 - foo(); // 正常运行,因为foo在代码运行前已经被创建 + foo(); // 正常运行,因为 foo 在代码运行前已经被创建 function foo() {} ### 函数赋值表达式 @@ -39,7 +39,6 @@ `bar` 函数声明外是不可见的,这是因为我们已经把函数赋值给了 `foo`; 然而在 `bar` 内部依然可见。这是由于 JavaScript 的 [命名处理](#function.scopes) 所致, 函数名在函数内*总是*可见的。 -> **注意:**在IE8及IE8以下版本浏览器bar在外部也是可见的,是因为浏览器对命名函数赋值表达式进行了错误的解析, +> **注意: **在 IE8 及 IE8 以下版本浏览器 bar 在外部也是可见的,是因为浏览器对命名函数赋值表达式进行了错误的解析, > 解析成两个函数 `foo` 和 `bar` -[30]: http://cnblogs.com/sanshi/ diff --git a/doc/zh/function/this.md b/doc/zh/function/this.md index 0930ef26..967c9dfb 100755 --- a/doc/zh/function/this.md +++ b/doc/zh/function/this.md @@ -9,7 +9,8 @@ JavaScript 有一套完全不同于其它语言的对 `this` 的处理机制。 当在全部范围内使用 `this`,它将会指向*全局*对象。 -> **[译者注][30]:**浏览器中运行的 JavaScript 脚本,这个全局对象是 `window`。 +> **[译者注][30]:**浏览器中运行的 JavaScript 脚本,这个全局对象是 `window`; +> 在 nodejs 环境中运行的 Javascript 脚本,这个全局对象是 `global`。 ###函数调用 @@ -22,13 +23,13 @@ JavaScript 有一套完全不同于其它语言的对 `this` 的处理机制。 ###方法调用 - test.foo(); + test.foo(); 这个例子中,`this` 指向 `test` 对象。 ###调用构造函数 - new foo(); + new foo(); 如果函数倾向于和 `new` 关键词一块使用,则我们称这个函数是 [构造函数](#function.constructors)。 在函数内部,`this` 指向*新创建*的对象。 @@ -39,7 +40,7 @@ JavaScript 有一套完全不同于其它语言的对 `this` 的处理机制。 var bar = {}; foo.apply(bar, [1, 2, 3]); // 数组将会被扩展,如下所示 - foo.call(bar, 1, 2, 3); // 传递到foo的参数是:a = 1, b = 2, c = 3 + foo.call(bar, 1, 2, 3); // 传递到 foo 的参数是:a = 1, b = 2, c = 3 当使用 `Function.prototype` 上的 `call` 或者 `apply` 方法时,函数内的 `this` 将会被 **显式设置**为函数调用的第一个参数。 @@ -53,14 +54,14 @@ JavaScript 有一套完全不同于其它语言的对 `this` 的处理机制。 ###常见误解 尽管大部分的情况都说的过去,不过第一个规则(**[译者注][30]:**这里指的应该是第二个规则,也就是直接调用函数时,`this` 指向全局对象) -被认为是JavaScript语言另一个错误设计的地方,因为它**从来**就没有实际的用途。 +被认为是 JavaScript 语言另一个错误设计的地方,因为它**从来**就没有实际的用途。 Foo.method = function() { function test() { // this 将会被设置为全局对象(译者注:浏览器环境中也就是 window 对象) } test(); - } + }; 一个常见的误解是 `test` 中的 `this` 将会指向 `Foo` 对象,实际上**不是**这样子的。 @@ -72,7 +73,7 @@ JavaScript 有一套完全不同于其它语言的对 `this` 的处理机制。 // 使用 that 来指向 Foo 对象 } test(); - } + }; `that` 只是我们随意起的名字,不过这个名字被广泛的用来指向外部的 `this` 对象。 在 [闭包](#function.closures) 一节,我们可以看到 `that` 可以作为参数传递。 diff --git a/doc/zh/intro/license.md b/doc/zh/intro/license.md index 33aa7406..057dd8a6 100755 --- a/doc/zh/intro/license.md +++ b/doc/zh/intro/license.md @@ -1,7 +1,7 @@ ##许可 JavaScript 秘密花园在 [MIT license][1] 许可协议下发布,并存放在 [GitHub][2] 开源社区。 -如果你发现错误或者打字错误,请[新建一个任务单][3]或者发一个抓取请求。 +如果你发现错误,请[新建一个任务单][3]或者发一个抓取请求(Pull Request)。 你也可以在 Stack Overflow 的 [JavaScript 聊天室][4]找到我们。 [1]: https://github.com/BonsaiDen/JavaScript-Garden/blob/next/LICENSE diff --git a/doc/zh/object/forinloop.md b/doc/zh/object/forinloop.md index a0360e7e..16f9faaa 100755 --- a/doc/zh/object/forinloop.md +++ b/doc/zh/object/forinloop.md @@ -37,5 +37,4 @@ 推荐**总是**使用 `hasOwnProperty`。不要对代码运行的环境做任何假设,不要假设原生对象是否已经被扩展了。 [1]: http://www.prototypejs.org/ -[30]: http://cnblogs.com/sanshi/ diff --git a/doc/zh/object/general.md b/doc/zh/object/general.md index a97b6d86..3ada17fa 100755 --- a/doc/zh/object/general.md +++ b/doc/zh/object/general.md @@ -25,7 +25,7 @@ JavaScript 中所有变量都可以当作对象使用,除了两个例外 [`nul JavaScript 的对象可以作为[*哈希表*][1]使用,主要用来保存命名的键与值的对应关系。 使用对象的字面语法 - `{}` - 可以创建一个简单对象。这个新创建的对象从 `Object.prototype` -[继承](#object.prototype)下面,没有任何[自定义属性](#object.hasownproperty)。 +[继承](#object.prototype)下来,没有任何[自定义属性](#object.hasownproperty)。 var foo = {}; // 一个空对象 @@ -34,7 +34,7 @@ JavaScript 的对象可以作为[*哈希表*][1]使用,主要用来保存命 ### 访问属性 -有两种方式来访问对象的属性,点操作符或者中括号操作符。 +有两种方式来访问对象的属性,点操作符和中括号操作符。 var foo = {name: 'kitten'} foo.name; // kitten diff --git a/doc/zh/object/hasownproperty.md b/doc/zh/object/hasownproperty.md index 2466f8c5..c9b3fc21 100755 --- a/doc/zh/object/hasownproperty.md +++ b/doc/zh/object/hasownproperty.md @@ -8,8 +8,8 @@ `hasOwnProperty` 是 JavaScript 中唯一一个处理属性但是**不**查找原型链的函数。 - // 修改Object.prototype - Object.prototype.bar = 1; + // 修改 Object.prototype + Object.prototype.bar = 1; var foo = {goo: undefined}; foo.bar; // 1 @@ -18,8 +18,8 @@ foo.hasOwnProperty('bar'); // false foo.hasOwnProperty('goo'); // true -只有 `hasOwnProperty` 可以给出正确和期望的结果,这在遍历对象的属性时会很有用。 -**没有**其它方法可以用来排除原型链上的属性,而不是定义在对象*自身*上的属性。 +只有 `hasOwnProperty` 可以给出正确和期望的结果。可以查看 [`for in` 循环](#object.forinloop) +章节来获取关于在迭代遍历对象属性的时候,何时使用 `hasOwnProperty` 的更多信息。 ###`hasOwnProperty` 作为属性 @@ -35,7 +35,7 @@ JavaScript **不会**保护 `hasOwnProperty` 被非法占用,因此如果一 foo.hasOwnProperty('bar'); // 总是返回 false - // 使用其它对象的 hasOwnProperty,并将其上下文设置为foo + // 使用其它对象的 hasOwnProperty,并将其上下文设置为 foo ({}).hasOwnProperty.call(foo, 'bar'); // true ###结论 @@ -44,4 +44,3 @@ JavaScript **不会**保护 `hasOwnProperty` 被非法占用,因此如果一 同时在使用 [`for in` loop](#object.forinloop) 遍历对象时,推荐**总是**使用 `hasOwnProperty` 方法, 这将会避免[原型](#object.prototype)对象扩展带来的干扰。 -[30]: http://cnblogs.com/sanshi/ diff --git a/doc/zh/object/prototype.md b/doc/zh/object/prototype.md index dff5cdbd..25a1d89d 100755 --- a/doc/zh/object/prototype.md +++ b/doc/zh/object/prototype.md @@ -23,19 +23,19 @@ other way around is a far more difficult task.) function Bar() {} - // 设置Bar的prototype属性为Foo的实例对象 + // 设置 Bar 的 prototype 属性为 Foo 的实例对象 Bar.prototype = new Foo(); Bar.prototype.foo = 'Hello World'; - // 修正Bar.prototype.constructor为Bar本身 + // 修正 Bar.prototype.constructor 为 Bar 本身 Bar.prototype.constructor = Bar; - var test = new Bar() // 创建Bar的一个新实例 + var test = new Bar(); // 创建Bar的一个新实例 // 原型链 test [Bar的实例] Bar.prototype [Foo的实例] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype {method: ...}; Object.prototype @@ -46,7 +46,7 @@ other way around is a far more difficult task.) 需要注意的是 `new Bar()` **不会**创造出一个新的 `Foo` 实例,而是 重复使用它原型上的那个实例;因此,所有的 `Bar` 实例都会共享**相同**的 `value` 属性。 -> **注意:** **不要**使用 `Bar.prototype = Foo`,因为这不会执行 `Foo` 的原型,而是指向函数 `Foo`。 +> **注意:** **不要**使用 `Bar.prototype = Foo`,因为这不会指向 `Foo` 的原型,而是指向函数 `Foo`。 > 因此原型链将会回溯到 `Function.prototype` 而不是 `Foo.prototype`,因此 `method` 将不会在 Bar 的原型链上。 ###属性查找 @@ -58,7 +58,7 @@ other way around is a far more difficult task.) ###原型属性 当原型属性用来创建原型链时,可以把**任何**类型的值赋给它(prototype)。 -然而将原子类型赋给 prototype 的操作将会被忽略。 +然而将原子类型(primitives)赋给 prototype 的操作将会被忽略。 function Foo() {} Foo.prototype = 1; // 无效 @@ -67,16 +67,16 @@ other way around is a far more difficult task.) ###性能 -如果一个属性在原型链的上端,则对于查找时间将带来不利影响。特别的,试图获取一个不存在的属性将会遍历整个原型链。 +如果一个属性在原型链的上端,则对于查找时间将带来不利影响。注意,试图获取一个不存在的属性将会遍历整个原型链。 并且,当使用 [`for in`](#object.forinloop) 循环遍历对象的属性时,原型链上的**所有**属性都将被访问。 ###扩展内置类型的原型 -一个错误特性被经常使用,那就是扩展 `Object.prototype` 或者其他内置类型的原型对象。 +扩展 `Object.prototype` 或者其他内置类型的原型对象,作为一个错误特性,经常被使用。 这种技术被称之为 [monkey patching][1] 并且会破坏*封装*。虽然它被广泛的应用到一些 JavaScript 类库中比如 [Prototype][2], -但是我仍然不认为为内置类型添加一些*非标准*的函数是个好主意。 +但是我仍然不赞同为内置类型添加一些*非标准*的函数。 扩展内置类型的**唯一**理由是为了和新的 JavaScript 保持一致,比如 [`Array.forEach`][3]。 diff --git a/doc/zh/other/timeouts.md b/doc/zh/other/timeouts.md index 7810b39f..4b2cc5d0 100755 --- a/doc/zh/other/timeouts.md +++ b/doc/zh/other/timeouts.md @@ -101,7 +101,7 @@ } bar(); -由于 `eval` 在这种情况下不是被[直接](#core.eval)调用,因此传递到 `setTimeout` 的字符串会自*全局作用域*中执行; +由于 `eval` 在这种情况下不是被[直接](#core.eval)调用,因此传递到 `setTimeout` 的字符串会到*全局作用域*中执行; 因此,上面的回调函数使用的不是定义在 `bar` 作用域中的局部变量 `foo`。 建议**不要**在调用定时器函数时,为了向回调函数传递参数而使用字符串的形式。 diff --git a/doc/zh/types/typeof.md b/doc/zh/types/typeof.md index f7a6cc1e..fec6fcf7 100755 --- a/doc/zh/types/typeof.md +++ b/doc/zh/types/typeof.md @@ -75,7 +75,7 @@ JavaScript 标准文档只给出了一种获取 `[[Class]]` 值的方法,那 Object.prototype.toString.call(undefined) // "[object Undefined]" -###测试为定义变量 +###测试未定义变量 typeof foo !== 'undefined' diff --git a/doc/zhtw/array/constructor.md b/doc/zhtw/array/constructor.md index 6c66656d..fd952497 100644 --- a/doc/zhtw/array/constructor.md +++ b/doc/zhtw/array/constructor.md @@ -10,7 +10,7 @@ new Array('3') // 結果: ['3'] 在上面的範例 `new Array(3)` 當只有一個參數傳入到 `Array` 的建構函數 -且那個參數事宜個數字,建構函數會回傳空值 +且那個參數是一個數字,建構函數會回傳空值 但是 `Array` 長度的屬性會變成跟那個參數一樣(以此範例來看他回傳的長度為 3) **注意** 只有他長度的屬性會被設定,整個 Array裡面的數值都不會初始化 diff --git a/doc/zhtw/array/general.md b/doc/zhtw/array/general.md index e9de8782..1a59d72e 100644 --- a/doc/zhtw/array/general.md +++ b/doc/zhtw/array/general.md @@ -7,7 +7,7 @@ > 只有 [objects](#object.general) 來管理建值的相對應關係 > Arrays 是**保持** 順序的,Objects **則沒有** -因為 `for in` 迴圈會列舉所有在原型 Array 上的屬性因為他會使用[`hasOwnProperty`](#object.hasownproperty), 這會使得 Array 比原本的 `for` 迴圈慢上二十幾倍 +因為 `for in` 迴圈會使用[`hasOwnProperty`](#object.hasownproperty),所以它會列舉所有在原型 Array 上的屬性,這會使得 Array 比原本的 `for` 迴圈慢上二十幾倍 ### 迴圈 @@ -20,8 +20,8 @@ 在上面的例子中利用 `l = list.length` 來處理 Array 的長度問題。 -雖然 `length` 屬性是屬於 Array 中其中一個屬性,但是他還使有一定的性能消耗在每次循環的訪問。 -近期 Javascript 使用 **may** 來解決在這上面的效率問題,但是在現在的引擎上還不一定有支援。 +雖然 `length` 屬性是屬於 Array 中其中一個屬性,但是他在每次循環還是有一定的性能消耗。 +近期 Javascript **可能**使用來解決在這上面的效率問題,但是在現在的引擎上還不一定有支援。 實際上,不使用暫存 Array 長度的方式比使用暫存的版本還要慢很多。 diff --git a/doc/zhtw/core/undefined.md b/doc/zhtw/core/undefined.md index 491f8528..501dfb95 100644 --- a/doc/zhtw/core/undefined.md +++ b/doc/zhtw/core/undefined.md @@ -1,6 +1,6 @@ ## `undefined` 和 `null` -JavaScript 中有兩個表示空值的方式, `null` 和 `undefined` , `undefined`式比較常用的一種。 +JavaScript 中有兩個表示空值的方式, `null` 和 `undefined` , `undefined`是比較常用的一種。 ### `undefined` 的值 diff --git a/doc/zhtw/function/arguments.md b/doc/zhtw/function/arguments.md index 7cb76032..39aa58f0 100644 --- a/doc/zhtw/function/arguments.md +++ b/doc/zhtw/function/arguments.md @@ -18,7 +18,7 @@ Array.prototype.slice.call(arguments); -這種轉化方式比較 **慢** ,不建議使用這種作法如果再追求效率的程式中。 +這種轉化方式比較 **慢** ,如果在追求效率的程式中,不建議使用這種作法。 ### 傳遞參數 @@ -53,7 +53,7 @@ 在 `Arguments` 物件創造的 *getter* 和 *setter* 的函數方法,可以被視為原本函數的變數。 -因此,改變了一個變數會跟著改變它的值而且也間接的改變稻香對應的 `arguments` 的物件,反之亦然。 +因此,改變了一個形式參將數會跟著改變對應的 `arguments` 的屬性,反之亦然。 function foo(a, b, c) { arguments[0] = 2; diff --git a/doc/zhtw/function/scopes.md b/doc/zhtw/function/scopes.md index 3e151282..d443656f 100644 --- a/doc/zhtw/function/scopes.md +++ b/doc/zhtw/function/scopes.md @@ -160,7 +160,7 @@ JavaScript 中所有的作用區,包括 *全域作用域*,都有一個特殊 1. 當作用域內是否有 `var foo` 的定義。 2. 函式形式參數是否有使用 `foo` 名稱定義。 - 3. 函式自身是剖叫做 `foo`。 + 3. 函式自身是否叫做 `foo`。 4. 回溯到上一個層級然後再從第一個開始往下去查。 > **注意: ** 自定義 `arguments` 參數會阻止原生的 `arguments` 的物件創立 diff --git a/doc/zhtw/function/this.md b/doc/zhtw/function/this.md index c5bf8d60..361a06c4 100644 --- a/doc/zhtw/function/this.md +++ b/doc/zhtw/function/this.md @@ -1,6 +1,6 @@ ## `this` 的工作原理 -JavaScript 有移到完全部屬於其他語言處理 `this` 的處理機制。 +JavaScript 有一道完全不屬於其他語言處理 `this` 的處理機制。 在 **五** 種不同的情況下, `this` 指向的各不相同 ### 全域變數 @@ -42,8 +42,7 @@ JavaScript 有移到完全部屬於其他語言處理 `this` 的處理機制。 當使用 `function.prototype` 上的 `call` 或只 `apply` 方法時,函式內的 `this` 將會被 **顯示設置** 為函式調用的第一個參數。 -As a result, in the above example the *method case* does **not** apply, and `this` -inside of `foo` will be set to `bar`. +因此,在以上的例子中已不適用*函式調用*的原則,而且`this`會被設定指向`bar`。 > **Note:** `this` **cannot** be used to refer to the object inside of an `Object` > literal. So `var obj = {me: this}` will **not** result in `me` referring to @@ -51,47 +50,48 @@ inside of `foo` will be set to `bar`. ### 常見誤解 -While most of these cases make sense, the first can be considered another -mis-design of the language because it **never** has any practical use. +儘管大部分的例子都合理,但第一個例子(譯者注: 應該是指前面呼叫一個函式的那個例子)可以被視為一個語言的不良設計,因為它**從來**就沒有實際用途。 Foo.method = function() { function test() { - // this is set to the global object + // this 設定為全域 } test(); - } + }; -A common misconception is that `this` inside of `test` refers to `Foo`; while in -fact, it **does not**. +一個常見的誤解是 `test` 中的 `this` 指向 `Foo` 物件,但實際上並**不是**。 -In order to gain access to `Foo` from within `test`, it is necessary to create a -local variable inside of `method` that refers to `Foo`. +為了在 `test` 中使用 `Foo` 物件,我們需要在 `method` 函式内部建立一個區域變數指向 `Foo`。 Foo.method = function() { var that = this; function test() { - // Use that instead of this here + // 這裡使用 that 而非 this } test(); - } + }; -`that` is just a normal variable name, but it is commonly used for the reference to an -outer `this`. In combination with [closures](#function.closures), it can also -be used to pass `this` values around. +`that` 只是普通的名字,不過這個名字常被用用來指向外部的 `this`。 在 [閉包](#function.closures) 一節,可以看到它(`that`)可以取代 `this` 傳遞。 -### Assigning Methods +在 ECMAScript 5 ,你可以使用 `bind` 結合匿名函式達到相同結果。 -Another thing that does **not** work in JavaScript is function aliasing, which is -**assigning** a method to a variable. + Foo.method = function() { + var test = function() { + // this 指向 Foo + }.bind(this); + test(); + }; + +### 函式表達式 + +另一個在 JavaScript 中**不會**運作的就是 function aliasing,也就是函式**賦值**給一個變數。 var test = someObject.methodTest; test(); -Due to the first case, `test` now acts like a plain function call; therefore, -`this` inside it will no longer refer to `someObject`. +上例中,`test` 就像一個普通的函式被调用;因此,函式内的 this 將不再指向 `someObject`。 -While the late binding of `this` might seem like a bad idea at first, in -fact, it is what makes [prototypal inheritance](#object.prototype) work. +雖然起初 `this` 的绑定特性似乎像是個壞主意,但事實上,它使得 [原型繼承](#object.prototype)得以運作。 function Foo() {} Foo.prototype.method = function() {}; @@ -101,7 +101,5 @@ fact, it is what makes [prototypal inheritance](#object.prototype) work. new Bar().method(); -When `method` gets called on an instance of `Bar`, `this` will now refer to that -very instance. - +當 `method` 被呼叫時,`this` 將會指向 `Bar` 的實體物件。 diff --git a/doc/zhtw/object/general.md b/doc/zhtw/object/general.md index aee1885c..6cd56600 100644 --- a/doc/zhtw/object/general.md +++ b/doc/zhtw/object/general.md @@ -69,7 +69,7 @@ JavaScript 的物件可以作為 [*Hashmaps*][1]使用,主要用來保存命 只有 `baz` 真正被刪除而已,所以從輸出結果中消失。 -### 屬姓名的語法 +### 屬性名的語法 var test = { 'case': 'I am a keyword, so I must be notated as a string', diff --git a/doc/zhtw/object/prototype.md b/doc/zhtw/object/prototype.md index d4df339f..83ad784a 100644 --- a/doc/zhtw/object/prototype.md +++ b/doc/zhtw/object/prototype.md @@ -33,7 +33,7 @@ JavaScript 不包含傳統繼承的模型,它使用的是*原型*模型。 // 原型鏈 test [instance of Bar] Bar.prototype [instance of Foo] - { foo: 'Hello World' } + { foo: 'Hello World', value: 42 } Foo.prototype { method: ... } Object.prototype diff --git a/doc/zhtw/types/instanceof.md b/doc/zhtw/types/instanceof.md index 5bdb00d2..fa5e8c30 100644 --- a/doc/zhtw/types/instanceof.md +++ b/doc/zhtw/types/instanceof.md @@ -1,6 +1,6 @@ ## `instanceof` 操作符 -`instanceof` 操作符用來比較兩個建構函數的操作數。只有在比較字定義的物件時才有意義。這和 [typeof operator](#types.typeof)一樣用處不大。 +`instanceof` 操作符用來比較兩個建構函數的操作數。只有在比較自定義的物件時才有意義。這和 [typeof operator](#types.typeof)一樣用處不大。 ### 比較定意義物件 @@ -24,7 +24,7 @@ 'foo' instanceof String; // false 'foo' instanceof Object; // false -有一點需要注意的, `instanceof` 不能用來物件來自上下文不同的屬性(例如:瀏覽器中不同的文檔結構),因為它的建構函數不一樣。 +有一點需要注意的, `instanceof` 不會在來自不同的上下文的物件運作(例如:瀏覽器中不同的文檔結構),因為它的建構函數不一樣。 ### In Conclusion diff --git a/doc/zhtw/types/typeof.md b/doc/zhtw/types/typeof.md index 7058e55b..0a0908b0 100644 --- a/doc/zhtw/types/typeof.md +++ b/doc/zhtw/types/typeof.md @@ -3,7 +3,7 @@ `typeof` 操作符 (和 [`instanceof`](#types.instanceof)) 可能是最大的設計錯誤在 JavaScript,因為它幾乎不可能從它們那裡得到想要的結果。 -雖然 `instanceof` 還是有一些限制上的使用, `typeof` 只有一個實際上的運傭情形,但是 **不是** 用在檢查物件的類型。 +雖然 `instanceof` 還是有一些限制上的使用, `typeof` 只有一個實際上的運用情形,但是 **不是** 用在檢查物件的類型。 > **注意:** 由於 `typeof` 也可以像函式的語法被調用,例如 `typeof(obj)`,但這並是一個函數調用。 > 那兩個小括號只是用來計算一個表達式的值,這個返回值會作為 `typeof` 操作符的一個操作數。 @@ -67,8 +67,8 @@ JavaScript 標準文檔只給出了一種獲取 `[[Class]]` 值的方法,那 ### 結語 為了去檢查一個物件,強烈建議去使用 `Object.prototype.toString` 因為這是唯一可以依賴的方式。 -正如上面所看到的 `typeof` 的亦先返回值在標準文檔中未定義,因此不同的引擎可能不同。 +正如上面所看到的 `typeof` 的事先返回值在標準文檔中未定義,因此不同的引擎可能不同。 -除非為了檢測一個變數是否定義,我們應該避免是用 `typeof` 操作符。 +除非為了檢測一個變數是否定義,我們應該避免使用 `typeof` 操作符。 diff --git a/garden.jade b/garden.jade index bd191d39..bb67c1d1 100644 --- a/garden.jade +++ b/garden.jade @@ -79,10 +79,10 @@ html(lang=language) footer p Copyright ©. Built with | - a(href='http://nodejs.org/') Node.js - | using a - a(href='https://github.com/visionmedia/jade/') jade - | template. + a(href='http://nodejs.org/') Node.js + | using a + a(href='https://github.com/visionmedia/jade/') jade + | template. script(src='http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js') diff --git a/site/style/garden.css b/site/style/garden.css index 9c95ff95..b6d29302 100644 --- a/site/style/garden.css +++ b/site/style/garden.css @@ -72,13 +72,12 @@ body { nav { position: fixed; - margin-left: 750px; top: 0; + right: 0; padding-bottom: 20px; height: 100%; - text-shadow: none; - width: 240px; + width: 225px; } nav > div li { @@ -607,7 +606,6 @@ a abbr { #nav_main > ul > li { float: left; text-align: center; - width: 25%; border-bottom: 0; }