任何人都可以解释这段代码的工作原理吗?
function makeAdder(x) {
return function(y) {
return x + y;
};
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
console.log(add5(2)); // 7
console.log(add10(2)); // 12
答案 0 :(得分:1)
当您致电makeAdder(5)
时,它会返回对新功能的引用。
function(y) {
return x + y;
};
所以add5
保留了引用。在您致电add5(2)
之后,您将2
传递给该功能。在它想要返回x + y
时,它开始找到变量。从x
开始,它看起来并且看到x
未在其中定义并转到scope
,其中定义了内部函数`here
function makeAdder(x) {
return function(y) {
return x + y;
};
}
在此处定义了x
,因为您在var x
期间调用并传递了add5 = makeAdder(5);
。在它找到y
并找到它的范围之后。毕竟返回x + y
。
这个想法是这样的,每个函数都有一个对它的creater(它被定义的地方)的引用,当它找不到变量时,它会发现它更大,所以直到全局范围。 /强>
答案 1 :(得分:1)
function makeAdder(x) {
return function(y) {
return x + y;
};
}
当您执行var add5 = makeAdder(5);
add5
成为返回我的makeAdder
的函数时,
add5
将关注
function(y){
return 5 + y;
}
所以,当你执行add5(2)
时,它会执行5 + 2并返回7;
答案 2 :(得分:0)
makeAdder(5)
x => 5和y没有值,因此x + y => 5 + 0 => 5
var add5 = makeAdder(5);
add5(2);
我们已经为函数makeadder创建了变量x =>五 所以现在我们传递y => 2和x => 5所以x + y => 5 + 2 => 7
在内部函数中可访问的外部函数变量的这个属性在javascript中称为closure属性。外部函数也无法访问该y变量。