Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вынести функцию из функции (https://javascript.ru/forum/misc/65110-vynesti-funkciyu-iz-funkcii.html)

evgeniyfill82 26.09.2016 21:54

Вынести функцию из функции
 
Я только начинаю немного понимать яваскрипт. Делаю свою маленькую игрульку, и что-то даже немного получается. Объем скрипта растет, и появилась необходимость раскинуть функции по отдельным файлам для удобства.
func1();
function func1(){
	var A=1;
	func2();
	func3();
  
	function func2(){
		A=2;
		alert('func2='+A); // 2
	}
	function func3(){
		alert('func3='+A); // 2
	}
}
// ---------------------------
func1x();
function func1x(){
	var A=1;
	func2x(A);
	func3x(A);
}
function func2x(perem){
	perem=2;
	alert('func2x='+perem); // 2
}
function func3x(perem){
	alert('func3x='+perem); // 1
}

Как правильно из func1 достать из func2 и func3? Желательно даже без передачи A параметром (а то придется кучу переменных в массив для этого собирать).

Coriolan161 26.09.2016 23:57

evgeniyfill82,
Так ты ж достал))

Aetae 27.09.2016 01:56

function func1x(){
    var obj={A:1};
    func2x(obj);
    func3x(obj);
}
function func2x(perem){
    perem.A=2;
    alert('func2x='+perem.A); // 2
}
function func3x(perem){
    alert('func3x='+perem.A); // 2
}
func1x();
function func1x(){
    var A=1;
    A = func2x(A);
    A = func3x(A);
}
function func2x(perem){
    perem=2;
    alert('func2x='+perem); // 2
    return perem
}
function func3x(perem){
    alert('func3x='+perem); // 2
    return perem
}
func1x();
var FuncLib = {
  func1x: function (){
    this.A=1;
    this.func2x();
    this.func3x();
  },
  func2x: function(){
    this.A = 2;
    alert('func2x='+this.A); // 2
  },
  func3x: function func3x(perem){
    alert('func3x='+this.A); // 2
  }
}
FuncLib.func1x();

Вот тебе три варианта: процедурный, функциональный и объектный.)

warren buffet 27.09.2016 04:59

Он не знает про scope, а вы ему ООП. Вот что он хочет.

(function(){

   var /* все переменные для всех функций внутри безымянной функции */;

   function foo(){
      /* доступны все */
   }

   function bar(){
      /* доступно всё */
   }

   function baz(){
      /* доступно всё */
   }

})();


Он же безусловно запускает свою func1() сейчас.

evgeniyfill82 27.09.2016 18:13

Спасибо, Aetae, подошел первый вариант, работает как надо. Но я надеялся, что можно будет обойтись без переделки переменных в единый объект (их тыщи-тыщи). Что поделать :) буду знать на будущее.

Еще вот вопрос имеется. Количество передаваемых в функцию данных влияет на скорость выполнения скрипта? То есть, если по вашему примеру, в объект obj я соберу все и вся что есть в игре и может понадобиться (герои, враги, карты и т.д.) и буду передавать obj во все подряд функции, это может повлиять на скорость?

warren buffet 27.09.2016 20:42

Цитата:

Сообщение от evgeniyfill82
и буду передавать obj во все подряд функции


Я же говорю, ему нужен просто scope для своей апликухи, а вы профессора его уводите с истинного пути. Не мучайте человека, скажите ему то же самое. )))

Aetae 27.09.2016 23:07

evgeniyfill82, нет, передаётся ссыка на объект, сам объект один, потому передавай сколько хошь.

P.S. То о чём говорит warren buffet:
(function(){
  var A;

  function func1x(){
    A=1;
    func2x();
    func3x();
  }
  function func2x(){
    A=2;
    alert('func2x='+A); // 2
  }
  function func3x(){
    alert('func3x='+A); // 2
  }
  func1x();
}())

Только тут каждую переменную придётся объявлять отдельно, и если будут именно разные файлы, то это всё рано бессмысленно.

evgeniyfill82 28.09.2016 00:03

Ясно. Спасибо.
Да, мне важно было именно разделить на разные файлы. А то пальчик устал колесико туда-сюда крутить, и в глазах рябит.
Я еще надеялся сначала, что можно будет гетСкриптом подгрузить функции в какое надо место, вроде как инклюдом как пхп, но не работает так.

Aetae 28.09.2016 00:57

Вообще по-хорошему, тебе нужны модули. Но это потребует специального сборщика и других заморочек, которые взорвут начинающему мозг.)

Однако в итоге, если дело дойдёт до серьёзной работы, то всё равно придётся с этим всем разбираться. Вот вроде смешной пост на эту тему, но смешной он до тех пор пока не понимаешь, что вся эта фигня действительно тебе нужна.)

warren buffet 28.09.2016 09:45

Aetae, ему нужна IDE чтобы колесико не крутить.

ТС, научись пользоваться хотя бы поиском в своем блокноте.


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