Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите с функцией (https://javascript.ru/forum/misc/59289-pomogite-s-funkciejj.html)

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

Цитата:

Сообщение от Rise
Как ты себе это представляешь?

Я никак не представляю, вот и спросил, а EmperioAf вроде правильную ссылку дал.

ruslan_mart 04.11.2015 12:37

Цитата:

Сообщение от AntonMs
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_xDD
лепите везде как стандартный шаблон

Если не буду понимать несколько строк среди своего кода, то меня это будет мучать)

ruslan_mart 04.11.2015 17:47

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

(function() {

})();


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

AntonMs 04.11.2015 19:39

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

EmperioAf 04.11.2015 20:31

Цитата:

Сообщение от AntonMs
но вроде не встречал ситуации где это нужно

допустим вы хотите написать библиотеку которой будут все пользоваться (например jQuery).
Тогда вы пишите:
;(function(parameters){
  //создаём объект jQuery и вешаем на него все необходимые методы
  return jQuery;
}();


Часовой пояс GMT +3, время: 13:24.