Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   метод bind или обычное замыкание? (https://javascript.ru/forum/misc/49748-metod-bind-ili-obychnoe-zamykanie.html)

skrudjmakdak 27.08.2014 09:31

метод bind или обычное замыкание?
 
возьмем вот такой код:
<html>
	<body>
		<div>my text</div>
		<script type="text/javascript">

function clk(e, flag)
	{
	console.log(this);
	console.log(e);
	flag = !flag;
	console.log(flag);
	}

var div = document.querySelector('div');
div.onclick = clk.bind(div, false);
		</script>
	</body>
</html>


кликнув по div'у я заметил 2 минуса:
1. не нашел объект event который какбэ должен быть;
2. значение флага к большому сожалению не сохраняется((

и есть старое доброе обычное замыкание:
<html>
	<body>
		<div>my text</div>
		<script type="text/javascript">
var div = document.querySelector('div');
div.onclick = function (flag)
	{
	return function (e)
		{
		console.log(this);
		console.log(e);
		flag = !flag;
		console.log(flag);
		};
	}(false);
		</script>
	</body>
</html>

которое отрабатывает на ура.

я на сегодняшний день пришел к выводу, что bind не всегда хорош.. если меня не переубедят в обратном ;)

п.с. тестил в хроме

Octane 27.08.2014 11:46

Цитата:

Сообщение от skrudjmakdak
function clk(e, flag)

Цитата:

Сообщение от skrudjmakdak
div.onclick = clk.bind(div, false);

у тебя в "e" придет false, а в "flag" - объект события

skrudjmakdak 27.08.2014 11:52

Цитата:

Сообщение от Octane (Сообщение 327700)
у тебя в "e" придет false, а в "flag" - объект события

у меня и в первом и во втором случае - false

Octane 27.08.2014 12:12

var obj = {};
obj = !obj;
alert(obj);

;)

skrudjmakdak 27.08.2014 12:52

Octane, я не об этом. поклацай в 1 и 2 примере несколько раз. и увидишь разницу. в первом будет постоянно идти true, т.к. flag не сохраняется. а во втором будет сохраняться

Aetae 27.08.2014 12:58

В простых случаях обычно не заморачиваюсь и делаю так:
<script>
document.onclick = function click(e){
        console.log(this);
        console.log(e);
        click.flag = !click.flag;
        console.log(click.flag);
};
</script>

А bind предназначен совсем для иного.)

skrudjmakdak 27.08.2014 13:05

Aetae, как вариант))

skrudjmakdak 27.08.2014 20:14

кстати, меня сбили с толку ))
бывают случаи когда нужны дефолтные значения:
div1.onclick = fun.bind(div1, 'black', 43);
div2.onclick = fun.bind(div2, 'red', 27);
...

Octane 27.08.2014 22:51

bind ненужОн :D
function fun(event) {
    event.currentTarget; //-> div1 или div2
    this.color;
    this.count;
}

div1.addEventListener('click', {
    color: 'black',
    count: 43,
    handleEvent: fun
});

div2.addEventListener('click', {
    color: 'red',
    count: 27,
    handleEvent: fun
});

Sweet 27.08.2014 23:28

skrudjmakdak, так аргументы ж - наоборот. Сначала забинденные, потом те, которые при вызове передаются:
<html>
    <body>
        <div>my text</div>
        <script type="text/javascript">
 
function clk(flag, e)
    {
    console.log(this);
    console.log(e);
    flag = !flag;
    console.log(flag);
    }
 
var div = document.querySelector('div');
div.onclick = clk.bind(div, false);
        </script>
    </body>
</html>

Но, конечно, значение переменной при таком использовании менять нельзя.


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