2013-07-26 8 views
3

С JavasScript, скажем, есть innerFunction(), определенный в пределах outerFunction(). Если вы попытаетесь вызвать innerFunction(), за пределами outerFunction(), будет обнаружена ошибка, так как она не определена в пределах области действия.
Однако, если в outerFunction() вы назначаете innerFunction() событию, например событию клика, для некоторого внешнего элемента, например button, то из этой области действия кнопки можно вызывать innerFunction(), какими бы они ни были. Итак, почему вы можете сделать этот второй звонок innerFunction() из разных областей.Область действия Javascript и вызов из onclick

У меня есть рабочий пример: http://jsfiddle.net/rcmoore38/gPrMk/

Первоначальный changeColor() вызов не работает, но когда changeColor() назначается button, она может быть вызвана с помощью кнопки.

Спасибо!

+0

Функции указаны в обработчиках событий, и все они находятся в пределах видимости? – adeneo

+0

Почему «changeColor()» вызывается через кнопку, но не изначально, я понимаю, что при изменении кнопки «changeColor()» она находится в пределах области действия, но кнопка сама по себе не находится в пределах области действия. – user4815162342

+1

В вашем коде строка '$ (" # pid "). Css (" color ", function() {return get_random_color()});' можно изменить на '$ (" # pid "). Css (" color ", get_random_color());' без потери функциональности. – Halcyon

ответ

2

Нет «области действия кнопки». Случается, что вы назначаете прослушиватель событий из области видимости внутренней функции, и это все, что имеет значение в JavaScript. Область применения JS - это то, где объявляются функции.

В вашем примере:

$("#b").click(function() { changeColor() }); 

функция changeColor доступна через closure внутри анонимной функции, потому что она объявлена ​​во внешней области видимости. Когда вы определяете вложенную функцию, все переменные и функции из родительских функций будут доступны внутри нее. Поэтому, когда элемент кликается и анонимная функция вызывается, она все еще имеет ссылку на changeColor и может ее вызвать.

Вы также можете установить обработчик событий без использования закрытия, как это:

$("#b").click(changeColor); 

Как я уже сказал, главное, что changeColor находится в области видимости, когда вы ссылка это (не тогда, когда он на самом деле называемый в этом случае браузером).

+0

Просто, чтобы уточнить, 'changeColor()' изначально мог бы получить доступ ко всем переменным в 'gen()', но после начального вызова он имел бы только свои локальные переменные, которые переносятся как статические переменные в C? – user4815162342

+0

Нет, все переменные из всех внешних областей доступны в 'changeColor', всякий раз, когда он вызывается - до тех пор, пока вы вызываете его откуда-то, где видна« changeColor ». – bfavaretto

+0

И если эти переменные должны были быть изменены во внешней функции 'gen()', они также были бы изменены во внутренней функции, потому что все они просто ссылки? – user4815162342

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