0

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;

​</p>

4

5 回答 5

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价值。

于 2012-12-21T14:56:14.827 回答
1

您的add函数返回一个函数。所以当你这样称呼时:

add();

发生的是代码 ( ++i) 执行并返回一个函数。你不用那个函数做任何事情,但你可以. 你可以执行它:

add()();

这将运行++i,返回一个函数,运行该函数(运行i++)并返回另一个函数(因为该内部函数也返回一个函数。

等等。您的函数正在返回其他函数,因此每当您将另一个函数附加()到调用时,您所做的就是执行正在返回的函数。

于 2012-12-21T14:57:11.003 回答
1

您正在添加中返回一个函数

仅通过调用

add()

函数执行完毕,i 加一 // 1

你打电话时

add()()

返回的函数也add被执行,因此增加 i了 2 // 2

add()()()

调用add返回的函数,返回的函数返回的函数也调用add它,因此将 i 增加 4

但我觉得你发布的代码有点不正确,值应该是

add() //i = 1
add()() // i = 3
add()()() //i = 7
于 2012-12-21T14:58:33.320 回答
0

内部add()返回一个新函数。

所以调用add()()add()首先执行。之后add()将执行返回的函数

于 2012-12-21T14:57:05.967 回答
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++;
        }
    }()
};

为了避免无限循环,我删除了函数三中的函数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();

你可以整天玩这些函数调用,直到你对它有信心。

于 2012-12-21T15:27:15.820 回答