javascript - 如何使用闭包调用 Javascript 函数?

标签 javascript closures

版本 1

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

var say2=sayHello2("David");
say2();   

版本 2

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

sayHello2("David")();

问题:

  1. 为什么在版本一中,当您使用 var say2 调用 sayHello2 时,无需添加另一组空括号?
  2. 如果我去掉 return say; 行,错误消息会说 sayHello2 不是一个函数,为什么?
  3. 为什么说say2()是重点; (版本2的最后一行)?如果我删除该行,则不会发生任何变化,“HelloDavid”仍将被记录。

最佳答案

  1. 在两个代码示例中,都进行了两次函数调用。第一个和第二个的区别在于,在第一个样本中,第一个函数调用的结果存储在 say2 中。在进行第二个函数调用之前。第二个示例立即使用 sayHello2() 的返回值调用返回的函数。

  2. 如果没有return声明,然后 sayHello2()返回undefined .

  3. 这个问题的主张是删除 say2();行不会改变行为,是不正确的。如果你不打电话say2()那么什么都不会被记录。

查看sayHello2() :

function sayHello2(name){
  // Initialize the text that will be logged
  var text='Hello'+name;

  // Create the function that will log the message
  var say=function(){
    console.log(text);
  };

  // Return the logging function
  return say;
}

sayHello2()函数返回对调用 console.log() 的小函数的引用。由于函数是 JavaScript 中的对象值,因此对函数的引用与任何其他类型的值一样有效,并且可以存储在变量中或在表达式中使用。

请注意,当创建日志记录函数时,这是通过 var 完成的。初始化:

  var say=function(){
    console.log(text);
  };

这本质上与变量 say2 发生的情况相同。 :

var say2=sayHello2("David");

除了这里,在 = 的右侧标志有一个函数调用而不是函数实例化。

声明

say2();

因此正在调用从调用 sayHello2() 返回的小日志记录函数.

第二个代码示例执行相同的操作:

sayHello2("David")();

除了返回的函数引用没有中间存储之外。相反,该引用会立即用于进行第二个函数调用。

在第一个版本中,计算进行的函数调用:

var say2 = sayHello2("David"); // First function call
say2(); // Second function call

在第二个版本中:

// First          // Second
sayHello2("David")();

在 JavaScript 中,形式的表达式

something()

始终表示“将 something 解释为对函数的引用,并调用它(不传递任何参数)”。如果something不是对函数的引用,你会得到一个异常。所以在版本 2 中,我们的 somethingsayHello2("David") 。因为后面有第二组空括号,这意味着我们正在告诉 JavaScript 进行另一个函数调用。

关于javascript - 如何使用闭包调用 Javascript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42190193/

相关文章:

javascript - 如何设置扩展菜单在页面加载时关闭

javascript - AngularJS:通过单击外部元素选择单选按钮

javascript - 在数组中创建一个对象的多个实例

javascript - Angular : Cannot read property 'on' of undefined

ios - 这个数组扩展中的 "+"闭包在做什么?

c# - foreach 和 list.ForEach() 之间的闭包有何不同?

javascript - 如何在闭包内部将变量从全局移动到局部

javascript - 调试 Mixpanel track_forms

rust - 如何通过原始指针将闭包作为参数传递给 C 函数?

c# - 如何通过 lambda 表达式传递捕获的变量,就好像它未被捕获一样?