Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.08.2014, 09:31
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

метод 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 не всегда хорош.. если меня не переубедят в обратном

п.с. тестил в хроме
Ответить с цитированием
  #2 (permalink)  
Старый 27.08.2014, 11:46
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от skrudjmakdak
function clk(e, flag)
Сообщение от skrudjmakdak
div.onclick = clk.bind(div, false);
у тебя в "e" придет false, а в "flag" - объект события
Ответить с цитированием
  #3 (permalink)  
Старый 27.08.2014, 11:52
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

Сообщение от Octane Посмотреть сообщение
у тебя в "e" придет false, а в "flag" - объект события
у меня и в первом и во втором случае - false
Ответить с цитированием
  #4 (permalink)  
Старый 27.08.2014, 12:12
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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

Ответить с цитированием
  #5 (permalink)  
Старый 27.08.2014, 12:52
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

Octane, я не об этом. поклацай в 1 и 2 примере несколько раз. и увидишь разницу. в первом будет постоянно идти true, т.к. flag не сохраняется. а во втором будет сохраняться
Ответить с цитированием
  #6 (permalink)  
Старый 27.08.2014, 12:58
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

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

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

Последний раз редактировалось Aetae, 27.08.2014 в 13:05.
Ответить с цитированием
  #7 (permalink)  
Старый 27.08.2014, 13:05
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

Aetae, как вариант))
Ответить с цитированием
  #8 (permalink)  
Старый 27.08.2014, 20:14
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

кстати, меня сбили с толку ))
бывают случаи когда нужны дефолтные значения:
div1.onclick = fun.bind(div1, 'black', 43);
div2.onclick = fun.bind(div2, 'red', 27);
...
Ответить с цитированием
  #9 (permalink)  
Старый 27.08.2014, 22:51
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

bind ненужОн
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
});
Ответить с цитированием
  #10 (permalink)  
Старый 27.08.2014, 23:28
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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>

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Жидкое мыло или обычное? Matre Оффтопик 19 16.05.2011 16:59
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Общие вопросы Javascript 1 13.04.2011 22:09
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Internet Explorer 1 13.04.2011 21:59
Вопрос тупой, как сделать обычное по со списком или combobox иначе ? dennnyk Элементы интерфейса 1 07.07.2010 06:59
getProperty('href') в IE - Объект не поддерживает это свойство или метод kalexi Общие вопросы Javascript 2 04.05.2010 15:13