2017-02-14 1 views
1

Функция мыши в JQuery определяется как .click(handler), так почему я не могу сделать следующее:Почему a.click (b.toggle) не работает?

var object1 = $("#object1"); 
var object2 = $("#object2"); 
object1.click(object2.toggle); 

Ниже, однако, работает:

var object1 = $("#object1"); 
var object2 = $("#object2"); 
object1.click(function() { object2.toggle(); }); 

Вопрос в том, почему я нужно инкапсулировать обработчик функции в другую функцию, чтобы она работала? Я знаю, что в первом примере, функция toggle будет получать все данные события, но это, похоже, не влияет (также, то же самое происходит с другими функциями, такими как show, hide, fadeIn и т.д.)

UPDATE:

что касается аргументов, это также, кажется, работает:

var object1 = $("#object1"); 
var object2 = $("#object2"); 
object1.click(function(ev) { object2.toggle(ev); }); 

Итак, недопустимые аргументы, кажется, не является проблемой.

ОТВЕТ:

Объяснение проблемы, что сказал @SeanWessell, вот JSFiddle показывает проблему таким образом, я лучше понял его. Это не имеет никакого отношения к jQuery: https://jsfiddle.net/diegojancic/nffcnu8t/

+0

Ну 'щелчок()' принимает обратный вызов, Вам нужна функция для того, чтобы вызвать его. может быть способ сделать закрытие в ECMA-скрипте 6, но я не уверен. – Nicolas

+0

'toggle' также является функцией и должен быть действительным обратным вызовом, как я его вижу. –

+0

@charlietfl функция click получает только один аргумент, если я выполняю 'function (a, b, c) {}', тогда 'b' и' c' являются 'undefined'. –

ответ

1

Это не будет работать, потому что он будет назначать обработчик события щелчка, как

function (speed, easing, callback) { 
     return speed == null || typeof speed === "boolean" ? 
      cssFn.apply(this, arguments) : 
      this.animate(genFx(name, true), speed, easing, callback); 
    } 

При попытке присвоения обработчика как object1.click(object2.toggle); это так же, как это делать.

object1.click(
    function(speed, easing, callback) { 
    return speed == null || typeof speed === "boolean" ? 
     cssFn.apply(this, arguments) : 
     console.log(this) 
    this.animate(genFx(name, true), speed, easing, callback); 
    } 
); 

Обработчик не заботится о ссылке на объект2 в вашем примере. Он будет использовать функцию переключения, определенную jquery, и назначить это как обработчик, однако он больше не привязан.

Назначение обработчика, как object1.click(object2.toggle);, принимает буквальную функцию из объекта object2.toggle и применяется к нему как к обработчику. Это будет то же самое, что применить свойство одного объекта к другому.

var obj1 = { 
"prop1":"obj1PropValue" 
}; 

var obj2 = { 
"prop1":"obj2PropValue" 
} 

obj1.prop1 = obj2.prop1; 

Даже если obj2.prop1 был назначен из obj1 JavaScript не интересует, какой объект собственности пришел от него заботится только о стоимости, который был назначен. Такая же идея применяется для функций в javascript.

Функция - это не что иное, как свойство VALUE. Значение - ключевое слово.

JavaScript разработан на основе простой объектной парадигмы. Объектом является набор свойств, а свойство является ассоциацией между именем (или ключом) и значением.Значение свойства может быть функцией в , в случае которого свойство известно как метод. В дополнение к объектам , которые предопределены в браузере, вы можете определить свои собственные объекты. В этой главе описывается, как использовать объекты, свойства, функции и методы и как создавать свои собственные объекты.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

+0

Не уверен, что я понимаю. Не могли бы вы объяснить? В коде, который вы опубликовали, я вижу, что обратный вызов передается непосредственно в функцию «animate». –

+0

Вы назначаете обработчик как функцию, указанную выше. Это больше не связанное событие, связанное с jQuery. Это то же самое, что вытащить функцию, как эта скрипка. https://jsfiddle.net/SeanWessell/997wq7te/, поэтому больше нет ссылки на «это», где это цепляемый объект jQuery. Поскольку функция больше не привязана к объекту jQuery, genFX больше не находится в области видимости. Я бросил console.log этого в функцию, и теперь это щелчок, а не привязанный к объекту2. –

+0

Ваш пример, очевидно, не сработает. Вы делаете 'object1.click (toggle);' но 'toggle' не имеет ссылки на какой-либо объект. Выполнение 'object1.click (function() {toggle();});' в вашем примере тоже не работает. –

0

Это приемлемо с точки зрения синтаксиса, но не выполняется должным образом из-за контекста вызова. Если вы ссылаетесь на функцию таким образом (вместо того, чтобы обертывать внутри другой функции, которая вызывается через элемент), привязка this не будет правильно отображена и, следовательно, код не будет знать, что переключить.

+0

Это и @SeanWessell ответы кажутся правильными, но не объясняют, почему 'this' привязка или контекст теряется. Исходя из C#, это не имеет смысла. Благодарю. –

+1

«это» в JavaScript значительно отличается от других языков. В JavaScript он неустойчив. Объект, с которым связывается это «это», не основан на том, где «это» появляется в коде (как в случае с C#). Он определяется объектом, который находится в области, которая запускает код. –

+0

Смотрите следующее: http://stackoverflow.com/questions/41496958/this-does-not-work-properly-in-another-event-im-clueless-as-to-why/41496969#41497008 для другого ответа, что я написал, что объясняет это более подробно. –

Смежные вопросы