Вход

Просмотр полной версии : Помогите с функцией


AntonMs
04.11.2015, 10:53
Если делать как в примере ниже то переменная i обнуляется, а если не передавать ее аргументом то счетчик становится общей для всех вызовов функции, подскажите пожалуйста как сделать для каждого вызова свой счетчик?

i = 0
function calc(i, step){
i = i+step
console.log(i)
}

calc(i, 20)
calc(i, 30)

EmperioAf
04.11.2015, 11:46
https://learn.javascript.ru/closures#возврат-функции

AntonMs
04.11.2015, 12:30
Как ты себе это представляешь?
Я никак не представляю, вот и спросил, а EmperioAf вроде правильную ссылку дал.

ruslan_mart
04.11.2015, 12:37
i = 0


Запомните раз и навсегда, так переменные объявлять нельзя! Обязательно используйте ключевое слово var. И в глобальной области вообще ничего объявлять не нужно кроме классов.


function MyClass() { //Какой-то важный класс, который будет очень часто использоваться

};
MyClass.prototype.myMethod = function() {

};


(function() { //Тут весь нужный код

var a, b, c, d, e, f;

function myLocalFunc() { }

})();


А если важный класс использует какие-то переменные из вне, то лучше сделать так:

(function() {

var foo = 'bar';

window.MyClass = function() {
alert(foo);
};
MyClass.prototype.myMethod = function() {


};
})();

AntonMs
04.11.2015, 13:14
Ruslan_xDD, подобные конструкции для меня еще неисследованная территория.

ruslan_mart
04.11.2015, 13:19
AntonMs, ничего сильно так иследовать не нужно, просто запомните это и лепите везде как стандартный шаблон. Со времени всё поймёте сами. :)

AntonMs
04.11.2015, 16:07
лепите везде как стандартный шаблон
Если не буду понимать несколько строк среди своего кода, то меня это будет мучать)

ruslan_mart
04.11.2015, 17:47
AntonMs, Объясню вкратце, мы создаём ф-цию, которая вызывает саму себя:

(function() {

})();

А внутри неё, все переменные локальны, т.е., глобал мы не засоряем, понятно?

AntonMs
04.11.2015, 19:39
Ruslan_xDD, понятно, но вроде не встречал ситуации где это нужно.

EmperioAf
04.11.2015, 20:31
но вроде не встречал ситуации где это нужно
допустим вы хотите написать библиотеку которой будут все пользоваться (например jQuery).
Тогда вы пишите:

;(function(parameters){
//создаём объект jQuery и вешаем на него все необходимые методы
return jQuery;
}();

ruslan_mart
05.11.2015, 07:49
Ruslan_xDD, понятно, но вроде не встречал ситуации где это нужно.

Потому что почти никто так делает, но так делать нужно.

loljs
06.11.2015, 14:48
Ruslan_xDD, понятно, но вроде не встречал ситуации где это нужно.
Чтобы имена переменных скрыть. На самом деле, это особо и не нужно, если не боишься конфликтов. Просто кто-то сделал когда-то, и все стали лепить где не попадя, как попугаи.

Есть, правда, еще небольшой профит. Переменные локальны -- лукапы будут быстрей, если глобальный объект будет сильно захламлен. Но это только если производительность очень сильно критична, экономия на спичках в чистом виде + "бонусом" получаем оверхед по памяти.

AntonMs
09.11.2015, 16:23
loljs, я тоже так думаю, но из-за неопытности - раньше казалось что причин так делать больше чем две)