Function variables - отвън или вътре ? § Избягване на undifined ? Кавички fixed !


0
Къде да ги декларирам ? Да е отвън не ми изглежда добре, защото ако е с return value функциите стават малко за еднократна употреба :D Да е във функцията мисля, че е по-идейно, но Дончо ни учи вчера (днес, нз.. на лекцията за функции и масиви), че е КПК всички променливи да са отгоре ( може и аз да съм чул-недочул... 
Другият ми въпрос е (понеже съм добър човек, гледам да не флуудя форума с "двусрични въпроси") : Как да избегна Undifined.
В туй тук:
var i, n, result; function printFrom1ToN(number) { // var result = new String(); for (var i = 1; i <= number; i++) { result += i + " "; } return result.trim(); }
Ако седи така с коментара дава : undefined1 2 3 4 5... хрумна ми да ползвам new String просто за да го декларирам по някъв начин та да вади "по 'убав" резултат. Други идеи ? И ако греша някъде в разсъжденията си (колкото и ограничени да са те в сегашната им форма (бях се развихрил повече, написах 100 реда пост, после видях, че съм идиот и ползвам глобалната (горе декларираната result за два console.log-a, което водеше до (1,2,3,4,5,1,2,3...) и се чудих що така и си викам, че е странна работа та после видях колко съм умен :D ) (трябва да премахна тоя ми навик със скобите нз са колко трябва да затварям... )))(те да има )). (бях стигнал до "И ако греша някъде в разсъжденията си") моля да ме поправяте, me wants to learn ! :) 
И още нещо, така и така съм се засилил: Като цъкна ' или " обикновенно (тук не, нз why) трябва или да го затворя или да започна да пиша за да ми се визуализират кавичките. Къде какво да пипна, че да става просто с 1 цъкане и да мога да си спамя кавички колкото искам? Защото ако искам да използвам ' често се получава разни от тоя вид á ó í, а с " ä ö ï....
-----------------------------
Разбрах как да махна проблема кавичките :) Отиваш на Region and Language/Keyboard and Languages/ Change keyboards и на General добавяш US, а да не е US-International и след това махаш Ink Correction. Местиш езика на US и си готов :) 






Отговори



2

Променливите трябва да са най-отгоре в дадения scope. Тъй като функцията е единственото нещо, което ти създава различен scope, променливите, които ти трябват за дадена функция, ги дефинирай най-отгоре във въпросната функция. Така ще може и при нужда в целия код да имаш променливи с повтарящи се имена (i, len, result итн), които няма да се бъркат помежду си. Кавичките си вървят по две, на мен поне най-лесно ми е да ги напиша и двете и после да пиша между тях. Друг вариант е да си копираш една и да я пействаш колкото си искаш :)

Излиза undefined отпред, защото result трябва да го дефинираш горе като празен стринг, към който после долепяш останалите неща (result = '', по-добре от new String(), изобщо в джаваскрипт доколкото можеш избягвай new и конструкторите, както няма да напишеш var a = new Number(5) вместо а = 5, така и с останалите типове). Също така махни var пред i във for цикъла и този ред

var i, n, result; можеш да го вкараш вътре в тялото на функцията най-отгоре:

function printFrom1ToN(number) {
   var i,

        n,

        result = '';

...

Това 'n', ако не се ползва никъде, също може да го махнеш.


от topalkata (6442 точки)


2

 В JS добрата практика е да декларираш всички променливи в началото на функцията изредени със запетайки.

  Дори и итератор променливите като i, j и т.н. После в цикъла само им задаваш начална стойност (i = 0), но така ако имаш повече от един цикъл един след друг използваш една и съща итератор променлива. Причината е, че в JS ако в един цикъл декларираш for (var i = 0..) то i ще остане да живее и извън цикъла, и в следващия цикъл ще трябва само да й просвоиш стойност. А това най-малкото изглежда грозно, предполагам има и други причини.

 Това противоречи на принципите на КПК в C# където променливите трябва да се декларират максимално близко преди първото използване. В вата езика scope-a работи по различен начин.

 Само като side note, в js i+= 1 е много по-КПК от i++. Доколкото помня имаше нещо общо с начина, по който браузърите превеждат изчислението към по-ниското ниво.


от ivan.mihov1 (4988 точки)