闭包与回调有什么不同?

时间:2009-03-05 18:15:11

标签: javascript closures callback

我问a question about callbacks并得出另一个问题(见评论)。 闭包与回调有何不同?

9 个答案:

答案 0 :(得分:17)

检查以下内容:http://jibbering.com/faq/faq_notes/closures.html。它可以帮助您更好地理解闭包与函数的关系。

以下是一组闭包示例:http://www.javascriptkit.com/javatutors/closures2.shtml

基本上,回调就像一个函数指针。使它成为闭包的位是当该函数访问它所在的上下文中的任何内容时,就像它之外的变量一样。当发生这种情况时,该函数将使用变量的当前值(而不是复制它们)。见例4.

答案 1 :(得分:9)

不同的定义:

Callback -

  

回调是可执行代码,作为参数传递给其他代码。

Closure -

  

闭包是在包含一个或多个绑定变量的环境中计算的函数。调用时,函数可以访问这些变量。

答案 2 :(得分:4)

对闭包有一个很好的定义here

  

“闭包”是一种表达方式   (通常是一种功能)可以拥有   自由变量和   绑定这些变量的环境   (“关闭”表达式)。

在实践中,这意味着它是一个具有一些隐藏变量的函数。

回调是一个更高层次的想法。通常,它是一个传递的函数,其目的是在稍后调用。在JavaScript中,闭包通常用作回调。

答案 3 :(得分:4)

简单来说:使用上下文变量的回调是一个闭包。

答案 4 :(得分:1)

取决于上下文变量(即绑定变量(==对象状态)的回调将是一个闭包。它将是一个纯函数,否则,它只需要自由变量(==参数)。

答案 5 :(得分:0)

这是区分这两者的方法:

封闭

  

Closure用于扩展功能,例如,如果用户点击按钮,我们希望在屏幕上发生某些事情,在这种情况下,我们将使用Closure来传递用户事件(点击),然后将数据推送到视图。

回调

  

回调或多或少类似于闭包,但它更习惯于通知并提供同步功能。例如,如果执行jQuery Ajax调用,则会有success()error()beforeSend()等回调来处理异步数据。

答案 6 :(得分:0)

关闭:

  • 另一个函数中的一个函数关键字,您正在创建一个闭包

  • 或者一个函数返回另一个函数,我们可以说闭包

请注意普通英语:在另一个函数中作为参数传递的一点差异函数是回调,或者在另一个函数中的定义是闭包

#Take matrix size as input
n=int(input("Enter the matrix size"))

import numpy as np

#initialise nxn matrix with zeroes
mat=np.zeros((n,n))

#input each row at a time,with each element separated by a space
for i in range(n):
   mat[i]=input().split(" ")
print(mat)  
 **输出:

var length = 101;
function fn2() {
	console.log("fffxxx: "+this.length);
}
 
var obj = {
  length: 5,
  method3: function(fn) {
    fn();
    arguments[0]();
  }
};
 
obj.method3(fn2, 1);
   

答案 7 :(得分:0)

什么是回调函数?

回调函数是一个函数,

  • 作为参数传递给另一个函数
  • 在某种事件后被调用(लागू)
  • 父函数完成后,称为参数的函数就会被调用

我们用普通英语说 回调是由另一个函数调用的任何函数,该函数将第一个函数作为参数或作为参数传递的函数

  • 注意: 已调用:调用函数时,将执行函数内的代码。 或者我们这样说 通常使用术语“调用函数”代替“调用函数”。

通常说“调用功能”,“启动功能”或“执行功能”。

 function getUserInput(firstName, lastName, age, callback2,callback1) {
    var fullName = firstName + " " + lastName;

    // Make sure the callback is a function
    if (typeof callback2 === "function") {
    // Execute the callback function and pass the parameters to it
    callback2(fullName, age);
    }
	
    if (typeof callback1 === "function") {     
    callback1(lastName);
    }
}

function callbackforlastname1(lname){
 console.log("---");
}
 
function genericPoemMaker(name, aged) {
    console.log(name + " is finer than fine wine.");
     console.log("A " + aged + " of unfortunl smile");
}

getUserInput("Avinash", "Maurya", "26", genericPoemMaker,callbackforlastname1); 
p

答案 8 :(得分:-1)

我看不出这两者是如何相关的?闭包将局部状态的某些部分转化为某种功能,将其视为通过引用传递。

回调旨在通知您有关某些更改并重定向程序流。闭包可以修改本地状态,但是你永远不会像处理回调一样处理处理器时间。