我通过不同地调用i
函数为add
获取不同的值。有人能解释一下这里发生了什么吗?
var i = 0;
var add = function() {
++i;
return function() {
i++;
return function() {
i++;
add();
}
}
};
add(); // i = 1;
add()(); // i = 2;
add()()(); // i = 4;
答案 0 :(得分:4)
函数add
返回一个函数。此函数返回另一个函数。
所以:
add(); // Executes add, which returns a function.
add()(); // Execute the function returned by add.
add()()(); // Execute the function returned by the function returned by add
每个函数只会将i
值加1。这解释了i
值。
答案 1 :(得分:1)
您的add
函数返回一个函数。所以当你这样称呼时:
add();
会发生什么,代码(++i
)执行并返回一个函数。您不对该功能执行任何操作,但可以。你可以执行它:
add()();
这将运行++i
,返回一个函数,运行该函数(运行i++
)并返回另一个函数(因为该内部函数也返回一个函数。
等等。您的函数正在返回其他函数,因此每当您向调用追加另一个()
时,您正在执行的函数就是执行正在返回的函数。
答案 2 :(得分:1)
您正在添加添加
的功能仅拨打
add()
执行该功能,i增加一个// 1
致电时
add()()
add
返回的函数也会被执行,因此也会增加
i
乘以2 // 2
add()()()
调用返回的函数add
,返回函数返回的函数,
也在其中调用add
,
因此将i增加4
但是,我将您发布的代码略微不正确,值应为
add() //i = 1
add()() // i = 3
add()()() //i = 7
答案 3 :(得分:0)
在add()
内,会返回一个新函数。
因此,调用add()()
将首先执行add()
。之后,add()
返回的函数将被执行
答案 4 :(得分:0)
在javascript中“()”是函数调用操作符。所以每次调用“()”时,它都会尝试在此运算符之前调用该函数。在您的情况下,分配一个函数来添加。让我为每个函数分配一个名称,这样就很容易理解。
var i = 0;
var add = function one() {
++i;
return function two() {
i++;
return function three() {
i++;
add();
}
}
};
// This will execute function one
// and return function two.
add();
// This will execute function one and two,
// return function three
add()();
// This will execute function one, two, three,
// return function two. Why?
// Because in function three, we call add() which will execute
// function one and return function two as I mentioned above.
add()()();
现在让我们看看你是否真的理解函数调用。
var i = 0;
var add = function one() {
i++;
return function two() {
i++;
return function three() {
i++;
}
}()
};
我删除函数three中的函数add()以避免无限循环,并在函数二之后添加“()”。 那么如果我们现在调用add()呢?
// This will execute function one and return function two,
// function two will invoke itself because of "()" at the end
// I added and return function three. So call add() will
// execute function one and function two, return function three.
// So i = 2 in this case.
add();
你可以整天玩这些函数调用,直到你对它有信心。