回调函数

4

我想要理解回调函数。我看过很多文章和Stack Overflow的帖子,但是解释循环而且我感觉自己越来越难懂了。显然我已经在JavaScript事件中使用了它们,但这更像是“记住这些代码行”的程度,而不是真正理解。”

这是我的理解:

假设你有两个对象,函数p()和函数k()。你将函数k传递给函数p()。然后,p()可以访问k的内部变量。

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

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

p(k);

尴尬的是,我花了很长时间才做到这一点。

1
我认为你可能混淆了回调函数和闭包。 - Alex Mcp
1
太好了...闭包是什么鬼...我要疯了,哈哈,认真的,现在需要去睡觉了。 - jason
3
不要道歉,我的智商是140,接受过昂贵的教育,并且大约60%的清醒时间都在电脑上,但我仍然无法理解它们。它们似乎..非常复杂...为什么要用不可预测的错误程序来破坏过程?把那些东西分开。我讨厌它们。 - Alex Gray
2个回答

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()callback参数是callbackFunction,但是,如果你注意到,我们还没有调用函数,我们正在传递一个包含函数的变量,它的arg函数只是一些用于alert()。当执行calledFunction()时,它会将作为callback参数传递的任何内容作为第一个且唯一的参数,并调用它。编辑:如果使用function foo() {}样式的声明,仍然可以正常工作。(以防万一; 我不知道你对JavaScript有多熟悉)

-1

你做错了。在k()中,this.n = 5;并没有设置它的“内部变量”,而x.n访问的是函数对象的x属性,而不是它的内部变量。 试试这个:

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

变量绑定是一个重要的编程概念。

我认为这篇文章会有所帮助。http://www.hunlock.com/blogs/Functional_Javascript


当调用x()时(它只是伪装成x的k),n仍然在作用域内。这是重点吗? - jason
@John,是的,我刚才运行了,n 未定义。 - jason
而且,在这两个函数中,this关键字都是指窗口对象,即使在x()函数内部也是如此。 - jason
我猜那个网站是错的。 "JavaScript作用域:利用函数可以访问调用者作用域中的所有局部变量的事实,“优化”JavaScript代码。" http://mindprod.com/jgloss/unmaintricks.html - Ming-Tang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接