Из документов я понимаю, что .proxy()
это изменило бы область действия функции, передаваемой в качестве аргумента. Может кто-нибудь объяснить мне это лучше? Почему мы должны это делать?
javascript
jquery
Адитья Шукла
источник
источник
Ответы:
В конечном итоге он гарантирует, что значение
this
в функции будет значением, которое вы желаете.Типичным примером является то,
setTimeout
что происходит внутриclick
обработчика.Возьми это:
Намерение достаточно простое. Когда
myElement
нажата кнопка, она должна получить классaNewClass
. Внутри обработчикthis
представляет элемент, по которому щелкнули.Но что, если мы хотим небольшую задержку перед добавлением класса? Мы могли бы использовать a
setTimeout
для достижения этой цели, но проблема в том, что независимо от того, какую функцию мы даемsetTimeout
, значениеthis
внутри этой функции будетwindow
вместо нашего элемента.Поэтому вместо этого мы можем вызвать
$.proxy()
функцию и значение, которое мы хотим присвоитьthis
, и вызвать функцию, которая сохранит это значение.Таким образом, после того, как мы дали
$.proxy()
функцию и значение, которое мы хотимthis
, она вернула функцию, которая будет гарантировать, чтоthis
она установлена правильно.Как это сделать? Он просто возвращает анонимную функцию, которая вызывает нашу функцию, используя
.apply()
метод, который позволяет ей явно установить значениеthis
.Упрощенный взгляд на возвращаемую функцию может выглядеть так:
Таким образом, эта анонимная функция дана
setTimeout
, и все, что она делает, это выполняет нашу исходную функцию с соответствующимthis
контекстом.источник
$.proxy(function () {...}, this)
а не(function() {...}).call(this)
? Есть ли разница?.call
вами вызов функции немедленно. С помощью$.proxy
, это какFunction.prototype.bind
где он возвращает новую функцию. Эта новая функция имеетthis
постоянное значение, поэтому, когда она передаетсяsetTimeout
иsetTimeout
вызывает функцию позднее, она все равно будет иметь правильноеthis
значение.Не вдаваясь в подробности (что было бы необходимо, поскольку речь идет о Context в ECMAScript, переменной this context и т. Д.)
В ECMA- / Javascript есть три разных типа «Контекстов»:
Каждый код выполняется в контексте выполнения . Существует один глобальный контекст, и может быть много экземпляров функциональных (и eval) контекстов. Теперь интересная часть:
Каждый вызов функции входит в контекст выполнения функции. Контекст выполнения функции выглядит следующим образом:
Область
действия объекта активации Цепочка
этого значения
Таким образом, это значение является специальным объектом, который связан с контекстом выполнения. В ECMA- / Javascript есть две функции, которые могут изменять значение this в контексте выполнения функции:
Если у нас есть функция,
foobar()
мы можем изменить значение this , вызвав:Теперь мы можем получить доступ
foobar
к объекту, который мы передали:Это именно то, что
jQuery.proxy()
делает. Он принимаетfunction
иcontext
(который является ничем иным, как объектом) и связывает функцию, вызывая.call()
или.apply()
и возвращает эту новую функцию.источник
Я написал эту функцию:
источник
Та же цель может быть достигнута с помощью «Сразу-Вызывается функция Expression, короткий: IIFE»
функция , выполняющейся сама:источник