javascript - 根据它们的构造方式,回调也可以定义为闭包吗?

标签 javascript closures callback

在 JavaScript 中,我知道闭包可以定义为可以访问其包含函数变量的嵌套函数。例如:

function outerFunction(x, y) {
    function innerFunction() {
        return x + y + 10;
    }
    return innerFunction;
}

现在,下面的代码正在为请求对象的 onreadystatechange 属性连接一个回调;但是,我想知道,根据定义,这是否也被认为是一个闭包:

/* This is a contrived example, I know. 
 * Bear with me - it demonstrates the point I'm trying to convey. */

function submitHandler() {

    var oRequest = createRequest(); // assume I'm getting an instance of the xhr
    var sUsername = 'Tom';          // assume this is needed for work in the handler
    var This = this;
    oRequest.onreadystatechange = function() {
        This.handleResponse(oRequest, sUsername)
    }

}

function handleResponse(oResponse, sUsername) {
    if(oResponse.readyState === 4 && oResponse.status === 200) {
        // do work with the username
    } else {
        // we're not done yet...
    }
}

我意识到 handleResponse 函数也可以在 submitHandler 的上下文中编写为匿名函数,但我发现更复杂的 Ajax 代码可以更具可读性如果回调定义在回调它们的函数范围之外,则很容易维护。同样,这是我使用的一个人为示例,希望能简单地证明我的问题的要点。

最佳答案

是的,根据定义,您假设它是闭包是正确的。

听起来你很了解你的东西,但是here is a good, extensive article on javascript closures .

关于javascript - 根据它们的构造方式,回调也可以定义为闭包吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/457549/

相关文章:

javascript - Ext Js 上传文件会在响应时弹出一个文件对话框

javascript - 为什么这个 javascript 函数失去了闭包作用域?

javascript - 通过 shouldComponentUpdate 对无状态、函数式组件进行 React 优化

JavaScript:闭包和全局函数之间的开销比较

javascript - 是否可以在Javascript中的setTimeout()方法中使 "value"自增?

c - 与正常函数调用相比仍然没有得到回调

javascript - Cordova 插件 - 回调仅执行一次

go - true 或 false 应该终止回调迭代吗?

javascript - 如何检测不同的 File 对象引用同一个文件?

javascript - 在 HOC 中包装数据获取组件以在加载时显示微调器