当我们返回函数时,闭包如何在Javascript中工作?

时间:2017-05-02 05:10:34

标签: javascript

假设我有两个函数test1和test2!

test1 = function(name){
    console.log('Hi, ', name);
};

test2 = function(name) {
    var text = 'Hello ' + name;
    var say = function() { console.log(text); }
    return say;
}

现在我调用该函数并将它们保存到vars,

var t1 = test1('John');
var t2 = test2('John');

这里到底发生了什么?

4 个答案:

答案 0 :(得分:2)

您的函数test1返回void,因为没有return语句 此功能将Hi John打印到控制台

您的函数test2将函数say()返回到控制台并将其存储在t2中。这使得t2成为一种功能。如果您注意test2中的语法,这是在javascript中定义函数的两种标准方法之一。如果你打电话

t2(); 您将得到类似的输出test1('John');

Hello John

答案 1 :(得分:2)

让我们理解

在下面的代码中,您定义了一个名为test1的函数,如果您使用test1('John'),它将打印Hi, John

test1 = function(name){
    console.log('Hi, ', name);
};

现在让我们理解下面的代码,下面你定义了一个名为test2的函数,其中:

test2 = function(name) {
    var text = 'Hello ' + name;
    var say = function() { console.log(text); }
    return say;
}
  • var text = 'Hello ' + name; //定义名为text
  • 的变量
  • var say = function() { console.log(text); } //定义一个名为say的函数,该函数将在控制台中的变量text中记录数据。
  • 然后您将返回say功能。

<强>输出:
输入:=&gt; var t1 = test1('John');
输出:=&gt; Hi, John //这很直截了当。

输入:=&gt; var t2 = test2('John');
输出:=&gt; undefined //您在这里重新分配从test2返回的sayt2的函数。因此,如果您现在输入t2,那么您将获得function () { console.log(text); }作为输出,类似于say

我希望你理解,抱歉英语不好。

答案 2 :(得分:1)

在调用时,test2返回'say',这是一个指向函数的指针,而不是值。这就是为什么它不输出任何东西。 要调用函数'say',您需要执行test2('john')()。 在第二对括号中,我们将参数传递给函数内部。

答案 3 :(得分:1)

你的第一个函数执行代码并且不返回任何东西然后t1将是未定义的。但是第二个函数返回一个函数,然后t2包含一个从未调用的函数,因此它不会记录到控制台