2010-09-04 10 views
4

Человек, который пытается понять функции обратного вызова. Я был над многими статьями и сообщениями здесь, на SO. Объяснения кажутся круговыми, и я думаю, что Im действительно получает от понимания LOL. Я использовал их, по-видимому, в событиях javascript, но тем более «запоминаю эти строки», чем «это то, что происходит и почему».функции обратного вызова

Так что я понимаю свое понимание.

Скажем, у вас есть 2 объекта, функция p() и функция k(). Вы передаете функцию k в p(). p() может затем получить доступ к внутренним переменным k.

function p(x){ 
    alert(x.n);//5 
} 

function k(){ 
    this.n = 5; 
} 

p(k); 

Смущающий, как долго его взяли, чтобы получить именно это.

+3

Что вы думаете? – BoltClock

+1

Я думаю, что вы можете вводить в заблуждение обратные вызовы с закрытием –

+1

отлично ... wtf является закрытием ... fml lol, srsly нужно ложиться спать сейчас – jason

ответ

4

Может быть, пример поможет?

// First, lets declare the function we're going to call 
calledFunction = function (callback, arg) { 
    callback(arg); 
}; 
// Second, lets declare the callback function 
callbackFunction = function (arg) { 
    alert(arg); 
}; 
// Next, lets do a function call! 
calledFunction(callbackFunction, "HAI"); 

Так, calledFunction() «s callback аргумент callbackFunction, но, если вы заметили, мы не называем функцию еще, мы пропусканием переменная содержит функцию, и его arg функция просто что-то alert(). Когда выполняется calledFunction(), он принимает все, что было передано как аргумент callback, и вызывает его с arg в качестве своего первого и единственного аргумента.

Помогли?

Редактировать: Это все еще работает, если вы используете function foo() {} -образные декларации. (на всякий случай, я не знаю, насколько вы свободны от JavaScript)

-1

Вы делаете это неправильно. this.n = 5; в k() не устанавливает свою «внутреннюю переменную», а x.n получает доступ к свойству объектного объекта x вместо его внутренней переменной. Попробуйте это:

function p(x) { alert(new x().n); }

переменной связывания является важным понятием программирования.

Я думаю, что эта статья помогает. http://www.hunlock.com/blogs/Functional_Javascript

+0

поэтому, когда вызывается x() (это просто k, маскируемое как x), n все еще находится в области видимости. Это точка? – jason

+0

@ John да, просто побежал, что n не определено – jason

+0

, и это ключевое слово является объектом окна в обеих функциях, даже внутри x() – jason

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