Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Надо вызывать функцию внутри другой функции (https://javascript.ru/forum/misc/60980-nado-vyzyvat-funkciyu-vnutri-drugojj-funkcii.html)

diga 30.01.2016 12:50

Надо вызывать функцию внутри другой функции
 
Доброго времени суток, как вызвать функцию
onDrop внутри init. Каким образом его можно изменить чтоб все работало?
Буду очень рад любой помощи
var init = function() {
  var board,
  game = new Chess();

  var onDrop = function(source, target) {
    var move = game.move({
      from: source,
      to: target,
      promotion: 'q'	 
    });
    if (move === null) return 'snapback';
    updateStatus();
  };

  var onSnapEnd = function() {
    board.position(game.fen());
  };
	
  var cfg = {
    position: 'start',
    onDrop: onDrop,
    onSnapEnd: onSnapEnd
  };

  $('#surrender').click(function(){
	$('#surrender').hide();
  });


};

destus 30.01.2016 14:09

может так? :-?
<script>
var func1 = function(){
			var func2 = function(){
				alert('Hello from func2');	
			}
			return func2;
	}
	var q = func1();
	q();
</script>

diga 30.01.2016 14:39

Цитата:

Сообщение от destus (Сообщение 405527)
может так? :-?

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

Lemme 30.01.2016 15:28

Нужно вызвать функцию2, которая объявлена в функции1 - не вызывая функцию1?

Никак.


Нужно вызвать функцию2, которая объявлега в функции1.


var bar;

function foo() {
	bar = function() {
  	alert('bar');
  } 
};

foo();
bar();

destus 30.01.2016 15:31

Цитата:

Сообщение от diga (Сообщение 405528)
в данном случае вызывается первая функция, внутри которой выполняется вторая, в моем случае надо вызвать именно вторую, нужно делать через объекты, но у меня не получается

Чтобы не выполнялся остальной код, а вызывалась именно вложенная функция, можно параметром передавать в первую функцию что именно надо.

<script>
		var func1 = function(param){
			var func2 = function(){
					alert('Hello from func2');	
				}
			switch (param)
			{
				case 'func2': 
				return func2();
				break;
				
				default: /* всё остальное */
					alert('Hello from func1');
			}
		}
		func1('func2');
</script>

diga 30.01.2016 15:44

я хотел сделал таким образом:
function init() {
  var board,
  game = new Chess();

  function onDrop(source, target) {
    var move = game.move({
      from: source,
      to: target,
      promotion: 'q'	 
    });
    if (move === null) return 'snapback';
  };

  onDrop.set = function(source, target) {
    var move = game.move({
      from: source,
      to: target,
      promotion: 'q'	 
    });
    if (move === null) return 'snapback';
  };
  
  var onSnapEnd = function() {
    board.position(game.fen());
  };	
	
  var cfg = {
    draggable: true,
    position: 'start',
    onDrop: onDrop,
    onSnapEnd: onSnapEnd
  };

  var board = ChessBoard('board', cfg);

}

т.е. добавил метод для функции, но когда вызываю я:
onDrop.set(параметры)
выдает ошибку:
Uncaught TypeError: Cannot read property 'set' of undefined

diga 30.01.2016 15:47

Цитата:

Сообщение от Lemme (Сообщение 405532)
Нужно вызвать функцию2, которая объявлена в функции1 - не вызывая функцию1?

Никак.


Нужно вызвать функцию2, которая объявлега в функции1.


var bar;

function foo() {
	bar = function() {
  	alert('bar');
  } 
};

foo();
bar();

т.е. мне надо глобально объявить переменную? в моем случае мне кажется это не очень корректно.
Попробовал выдает ошибку:
Uncaught TypeError: onDrop is not a function(…)


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

destus 30.01.2016 16:06

Цитата:

Сообщение от diga (Сообщение 405537)
т.е. мне надо глобально объявить переменную? в моем случае мне кажется это не очень корректно.
Попробовал выдает ошибку:
Uncaught TypeError: onDrop is not a function(…)


В js используется лексическая область видимости. Это означает, что внутренняя функция определена как свойство обьекта вызова внешней. Нельзя вызвать внутренню функцию, не вызвав внешнюю, потому что обьект вызова внешней функции еще не создан.

diga 30.01.2016 16:12

Цитата:

Сообщение от destus (Сообщение 405540)
В js используется лексическая область видимости. Это означает, что внутренняя функция определена как свойство обьекта вызова внешней. Нельзя вызвать внутренню функцию, не вызвав внешнюю, потому что обьект вызова внешней функции еще не создан.

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

Lemme 30.01.2016 16:51

https://learn.javascript.ru/prototypes


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