Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Можно ли "повесить" внутренние функции на кнопки? (https://javascript.ru/forum/misc/60517-mozhno-li-povesit-vnutrennie-funkcii-na-knopki.html)

Erolast 05.01.2016 15:31

Цитата:

а может лучше заменить объявление функции на функциональное выражение? (var main = function () {...} )
Лучше. Переиспользовать переменную разными сущностями - это хрень какая-то. Не надо злоупотреблять динамической типизацией.

Цитата:

onclick='main()()'
Тьфу, да, точно.

Цитата:

А как на другую кнопку повесить функцию stopMove() ? Как из main() вернуть 2 функции?
Вот ты и начал натыкаться на грабли переусложнения.
Я бы лучше сделал как-то так:
<script>
	var startMoving;
	var stopMoving;

	(function() {
		"use strict";

		var timer; //Зачем здесь сокращение?
		
		startMoving = function() {
			timer = setInterval(function moveButton() {
				var target = $("#startMovingButton");
				var offset = parseInt(target.css("margin-left")) + 1;
				target.css("margin-left", offset + "px");
			});
		}

		stopMoving = function() {
			clearInterval(timer);
		}
	})();
</script>

<button id="startMovingButton" onclick="startMoving();">Start moving</button>
<button id="stopMovingButton" onclick="stopMoving();">Stop moving</button>


А вообще-то для подобного рода инкапсуляции в JS существует система модулей - https://learn.javascript.ru/modules.

Keramet 05.01.2016 18:24

Цитата:

Сообщение от рони
Цитата:

Сообщение от Keramet (Сообщение 402649)
1) перед main = main() var нужен?

Нет

Мы не ставим var, чтобы main была глобальной переменной? Или для чего? :) Насколько я разобрался - вся "магия" в этой строке

Erolast 05.01.2016 18:52

Нет, var не ставится потому, что переменная с названием main и так уже объявлена с помощью function main(){}. Функции в JS - сущности первого класса и тоже хранятся через помещение в переменную.
Собственно, любая функция - это объект-инстанс класса Function, наследника класса Object и имеет все признаки обычного объекта:
var func = function(){};
console.log(func.constructor == Function); // true
console.log(func instanceof Object); //true

func.property = 10;
func.property++;
console.log(func.property); //11;


Что насчет присвоения в глобал с помощью опущения var - да, такой трюк раньше действительно был возможен, но начиная с ES5 он запрещен. В строгом режиме попытка обращения к необъявленной переменной сгенерирует ошибку.

Keramet 05.01.2016 19:21

Erolast,
Это я понял. Объясните мне, зачем в коде рони main = main()?

Erolast 05.01.2016 19:56

main = main() - перезапись переменной main результатом вызова функции, находящейся (потом уже находившейся) в этой переменной.

Зачем? Нахрена-то)

Keramet 05.01.2016 19:59

Цитата:

Сообщение от Erolast (Сообщение 402701)
main = main() - перезапись переменной main результатом вызова функции, находящейся (потом уже находившейся) в этой переменной.

Зачем? Нахрена-то)

:haha:
Спасибо за вразумительное объяснение ))


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