求教 JS闭包必须是自执行函数才能修改函数里的局部变量吗,这是为什么啊?

时间:2021-12-31 22:40:57



var add1 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f;
}()
add1()
add1()
console.log(add1());  //13

var add2 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f();
}
add2()
add2()
console.log(add2());  //11

var add3 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f;
}
add3()()
add3()()
console.log(add3()());  //11


如果要每执行一次函数都让a加1,并保存这个局部变量,就只能按第一种自执行的方式来写。后面两种不能达到想要的目的,哪位大神能告诉我这是为什么呢?

6 个解决方案

#1


第一次问问题,请懂的大神不吝赐教~

#2



var add1 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f;
}()
console.log(add1);//add1是f函数,只有调用f函数才能让在f函数之外定义的a变量每次增加。
add1()
add1()
console.log(add1());  //13

var add2 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f();
}
console.log(add2);//add2是外面的匿名函数,a变量是在匿名函数中定义的,每次调用add2函数都会重新把a赋值为10,再加1。
add2()
add2()
console.log(add2());  //11

var add3 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f;
}
console.log(add3);//add3是外面的匿名函数,同add2。
add3()()
add3()()
console.log(add3()());  //11
console.log(add3());//但是,“add3()”的返回值却是f函数,同add1。
var add4 = add3();//add4是f函数
add4()
add4()
console.log(add4());  //13

#3


add2 = (function(){
    var a = 10;
    function f(){
        return a=a+1;
    }
    return f();
})();

要这样写

或者写的清晰明白

var f = function(){
    var a = 10;
    function f(){
        return a=a+1;
    }
    return f();
}
var add2 = f();

#4


引用 2 楼 jslang 的回复:


var add3 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f;
}
console.log(add3);//add3是外面的匿名函数,同add2。
add3()()
add3()()
console.log(add3()());  //11
console.log(add3());//但是,“add3()”的返回值却是f函数,同add1。
var add4 = add3();//add4是f函数
add4()
add4()
console.log(add4());  //13


谢谢回复,那我想问一下是不是可以理解为add3()()直接执行的话其实是先调用那个匿名函数,然后再返回f()再调用,就跟add2一样了,是这个意思吗?

#5


引用 3 楼 KK3K2005 的回复:
add2 = (function(){
    var a = 10;
    function f(){
        return a=a+1;
    }
    return f();
})();

要这样写

或者写的清晰明白

var f = function(){
    var a = 10;
    function f(){
        return a=a+1;
    }
    return f();
}
var add2 = f();


谢谢回复,虽然你写的两个都应该是 return f;才能正确执行

#6


引用 4 楼 harryliuy 的回复:
Quote: 引用 2 楼 jslang 的回复:



var add3 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f;
}
console.log(add3);//add3是外面的匿名函数,同add2。
add3()()
add3()()
console.log(add3()());  //11
console.log(add3());//但是,“add3()”的返回值却是f函数,同add1。
var add4 = add3();//add4是f函数
add4()
add4()
console.log(add4());  //13


谢谢回复,那我想问一下是不是可以理解为add3()()直接执行的话其实是先调用那个匿名函数,然后再返回f()再调用,就跟add2一样了,是这个意思吗?

是的,你理解正确

#1


第一次问问题,请懂的大神不吝赐教~

#2



var add1 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f;
}()
console.log(add1);//add1是f函数,只有调用f函数才能让在f函数之外定义的a变量每次增加。
add1()
add1()
console.log(add1());  //13

var add2 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f();
}
console.log(add2);//add2是外面的匿名函数,a变量是在匿名函数中定义的,每次调用add2函数都会重新把a赋值为10,再加1。
add2()
add2()
console.log(add2());  //11

var add3 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f;
}
console.log(add3);//add3是外面的匿名函数,同add2。
add3()()
add3()()
console.log(add3()());  //11
console.log(add3());//但是,“add3()”的返回值却是f函数,同add1。
var add4 = add3();//add4是f函数
add4()
add4()
console.log(add4());  //13

#3


add2 = (function(){
    var a = 10;
    function f(){
        return a=a+1;
    }
    return f();
})();

要这样写

或者写的清晰明白

var f = function(){
    var a = 10;
    function f(){
        return a=a+1;
    }
    return f();
}
var add2 = f();

#4


引用 2 楼 jslang 的回复:


var add3 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f;
}
console.log(add3);//add3是外面的匿名函数,同add2。
add3()()
add3()()
console.log(add3()());  //11
console.log(add3());//但是,“add3()”的返回值却是f函数,同add1。
var add4 = add3();//add4是f函数
add4()
add4()
console.log(add4());  //13


谢谢回复,那我想问一下是不是可以理解为add3()()直接执行的话其实是先调用那个匿名函数,然后再返回f()再调用,就跟add2一样了,是这个意思吗?

#5


引用 3 楼 KK3K2005 的回复:
add2 = (function(){
    var a = 10;
    function f(){
        return a=a+1;
    }
    return f();
})();

要这样写

或者写的清晰明白

var f = function(){
    var a = 10;
    function f(){
        return a=a+1;
    }
    return f();
}
var add2 = f();


谢谢回复,虽然你写的两个都应该是 return f;才能正确执行

#6


引用 4 楼 harryliuy 的回复:
Quote: 引用 2 楼 jslang 的回复:



var add3 = function(){
var a = 10;
function f(){
return a=a+1;
}
return f;
}
console.log(add3);//add3是外面的匿名函数,同add2。
add3()()
add3()()
console.log(add3()());  //11
console.log(add3());//但是,“add3()”的返回值却是f函数,同add1。
var add4 = add3();//add4是f函数
add4()
add4()
console.log(add4());  //13


谢谢回复,那我想问一下是不是可以理解为add3()()直接执行的话其实是先调用那个匿名函数,然后再返回f()再调用,就跟add2一样了,是这个意思吗?

是的,你理解正确