javascript - JS 作用域/闭包如何传递参数

标签 javascript scope closures

有人可以解释为什么在下面的函数中,我可以将参数传递给嵌套函数吗?我的理解是它必须对闭包和作用域做一些事情(我认为我对此有很好的理解),但我似乎可以理解这个论点是如何被传递的。

下面的函数分别输出1,2。但是返回语句 doThis() 是如何得到“a”的参数的呢?我不知道这是在哪里/如何访问/传递的。

function doSomething(){
  var b = 1;
  return function doThis(a){
        console.log(b);//1
        console.log(a);//2
  }
}
var exec = doSomething();
exec(2);

最佳答案

函数 doSomething() 返回另一个函数,所以当你执行时

var exec = doSomething();

你可以认为 exec 包含以下函数

function doThis(a){ // <- takes an argument
    console.log(1); // comes from the b argument in the outer scope
    console.log(a); // not set yet
}

因此,当您调用 exec(2) 时,您实际上是在调用带有参数 2doThis(),它成为 的值>一个

这是一个稍微简化的版本。为了对此进行扩展,doSomething() 函数被描述为关闭 doThis() 创建一个闭包。相反,doThis() 函数关闭在闭包内。闭包本身只是函数的一个有限状态:

function doSomething(){ // --> defines the closure
  var b = 1; // variable only visible within doSomething()
  return function doThis(a){ //<--> function has access to everything in doSomething(). Also defines another closure
        console.log(b); // --> accesses the OUTER scope
        console.log(a); // <-- comes from the INNER scope
  } // <-- end INNER scope
} // --> end OUTER scope

当您执行 doSomething() 时,返回的结果仍然保留对其范围内的访问权限,这就是为什么 doThis() 可以访问值 b - 它很容易到达。这与您的操作方式类似

var foo = 40;

function bar(value) {
  return foo + value;
}

console.log(bar(2));

只有在这种情况下,任何其他代码都可以访问 foo,因为它是一个全局变量,所以如果您在不同的函数中执行 foo = 100,那将会改变bar() 的输出。闭包阻止内部 的代码可以从外部 闭包访问。

关于javascript - JS 作用域/闭包如何传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40368197/

相关文章:

java - 编译时变量的名称和生命周期

javascript - mongodb查询到javascript函数

javascript - Vanilla Javascript 算法,如何做和解释

javascript - OnBlur 验证需要在纯 Javascript 中单击两次提交按钮

javascript - 回调函数在原始函数之前执行

javascript - 我可以从作用域之外访问作用域变量吗?

reflection - 如何在 Dart 中从 String 创建闭包?

javascript - React Native FBSDK 处理身份验证拒绝

javascript - 如何在不每次都搜索单选组的情况下使用 jQuery 找出选择了哪个单选按钮?

c++ - 如何避免在 C++ 中自动释放?