【问题标题】:JavaScript closures and scoping: How to pass an outer scope variable to a callback function which is passed as an argument?JavaScript 闭包和作用域:如何将外部作用域变量传递给作为参数传递的回调函数?
【发布时间】:2019-01-24 15:09:31
【问题描述】:

我的代码是这样的:

im.size((function(a, b) {
  console.log(b);
  console.log(im);
})(im));

对象 im 有一个函数大小,它需要一个回调函数。它将参数 a 和 b 传递给回调函数。但是我需要让对象 im 在回调中可用。因此我从外部将它作为参数传递,但是这会“覆盖”传递给回调的参数 a 和 b。

输出是:

undefined 
[My Object]

如果我这样做:

im.size(function(a, b) {
  console.log(b);
  console.log(im);
});

输出是:

17
[My object] // edited: was undefined before

如何将 im 对象传递给回调范围内可用,以及获取传递给回调的变量?稍微解释一下也不错。

编辑: 实际上,在我的回调示例中可以访问外部范围。这对于异步回调也是如此吗?为什么外部范围可以通过这种方式访问​​?

【问题讨论】:

  • 第二个示例也应该可以工作,因为im 是在该范围内定义的(从第一个示例推导出来的)。
  • @PM77-1 不,与此无关。这里的问题中没有提到this
  • 如果一个变量在定义函数的范围内是可访问的,那么它也可以在该函数内访问。您可以使用im.size(im);im 传递给大小(例如),因此如果您使用im.size(function() {}),那么该函数也可以访问im
  • "异步回调也是如此" - 是的。 “为什么外部范围可以通过这种方式访问​​?”——这就是它的工作原理——它在词法范围内,所以它是可访问的。其他语言要求你明确声明要关闭哪些变量,JS 不需要。

标签: javascript scope callback closures


【解决方案1】:

第二个例子也应该可以工作,因为 im 是在那个范围内定义的(从第一个例子推导出来的)。

如果在定义函数的范围内可以访问变量,那么在该函数内也可以访问它。您可以通过im.size(im);im 传递给size(例如),因此如果您使用im.size(function() {}),该函数也可以访问im。

异步回调也是如此吗?

是的。

为什么外部作用域可以通过这种方式访问​​?

这就是它的工作原理——它在词法范围内,所以它是可访问的。其他语言要求您明确说明要关闭哪些变量,而 JS 则不需要。

【讨论】:

    猜你喜欢
    • 2017-03-15
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多