Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我们返回一个函数时,闭包在Javascript中是如何工作的?_Javascript - Fatal编程技术网

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

当我们返回一个函数时,闭包在Javascript中是如何工作的?,javascript,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

假设我有两个函数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');

这里到底发生了什么?

调用时,test2返回“say”,它是指向函数的指针,而不是值。这就是为什么它不会输出任何东西。 要调用函数“say”,您需要执行
test2('john')()

在第二对括号中,我们将参数传递给内部的函数。

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

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

t2()
您将获得类似于
test1('John')的输出


Hello John

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

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

现在让我们了解下面的代码,下面您定义了一个名为
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
    函数。
输出:
输入:=>
var t1=test1('John')
输出:=>
嗨,约翰
//很简单。

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


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

test1
将执行函数并打印出“
Hi John
返回未定义的
<代码>t1
将是
未定义的
test2
将返回一个新的
函数
,该函数在
文本
上带有一个闭包,并将其分配给
t2
t2
现在是一个新的
函数
。您需要执行它以获得任何输出,而您还没有这样做。yeti认为您可以调用say like
t2()好的完整答案!我发现了一个小错误:t2()打印“Hello John”,而test1(‘John’)打印“Hi,John”。但这对于技术理解来说当然并不重要。
test2 = function(name) {
    var text = 'Hello ' + name;
    var say = function() { console.log(text); }
    return say;
}