js关于闭包的问题

这个关于闭包的例子怎么理解

var a = 1;
function f(b){
    return function g(c){
        return function h(d){
            return a + b + c +d;
        }
    }
}

var add2 = f(2);
var add3 = add2(2);
var r = add3(10);

console.log(r);
阅读 2.1k
5 个回答

这个没什么难的吧

r 的结果就是 a + b + c +d这点没疑问吧,先说a,本身没有a变量,会逐级往外层找,最终找到了全局作用域下的a,也就是1;b也是同理,只不过到f函数这里就不继续往上找了,此时的b为f函数的参数,在var add2 = f(2)的时候传过来了,也就是2,同理c也是2,d是10

所以r = 1 + 2 + 2 + 10 = 15

f(2)执行完,
返回给add2 = function g(c){

    return function h(d){
        return a + b + c +d;
    }
}

add2(2)执行完给
add3 = function h(d){

        return a + b + c +d;
    }

add3(10) 执行的时候就return 1+2+2+10了

a,b,c都有值是因为你这是个嵌套函数,没执行完是不会释放内存的,不知道这样你能不能理解

重新该写一下代码:

var add2 = function g(c) {
    return function h(d) {
        return 1 + 2 + c + d // 替换掉参数 a,b
    }
};

var add3 = function h(d) {
    return 1 + 2 + 2 + d // 替换掉参数c
};

var r = (1 + 2 + 2 + 10) // 替换参数d
var add2 = f(2);   
//==> function g(c){
        return function h(d){
          return 1 + 2 + c + d;
        }
       }
    
var add3 = add2(2);
//==> function h(d){
          return 1 + 2 + 2 + d;
       }    
       
var r = add3(10);
//==> 1 + 2 + 2 + 10; 

console.log(r); //==> 15             

类似这样 每次执行返回一个新的函数 并缓存上一个函数的参数(如果有点话)

const a = 1;
const f = b => c => d => a + b + c + d;
f(2)(2)(10) // 2 => 2 => 10 => a + 2 + 2 + 10; return 15
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题