对于闭包的理解,一直很浅懂,特别有时候跟匿名函数混淆。所以收集下面各路对于闭包的讲解。
维基百科中的解释:“在计算机科学中,闭包(closure)又称语法闭包(Lexisal closure,是引用自由变量的函数,这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不列外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。” “在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可以产生闭包,运行时,一旦外部的函数被执行,一个闭包就形成了,闭包中包含了内部函数的代码,以及所需外部函数中引用。”
MDN: “闭包是函数和声名该函数的词法环境的组合”
StackOverflow Morris 的回答: 原文地址链接https://stackoverflow.com/questions/111102/how-do-javascript-closures-work
下面是他关于闭包的回答解释
掌握闭包核心的内容后,闭包就不是难懂的概念。但是,如果去查阅学术性论文或者学术向导的信息那就很难理解了。
本文是面向具有主流语言程序经验的程序员编写,能读懂下面的javascript函数:
function sayHello(name){
var text='hello'+name;
var say=function(){
console.log(text);
}
say();
}
sayHello('Joe')
闭包的例子
两句话概括
- 闭包是支持一级函数的一种方式;它是一种表达式,可以在其作用域内引用变量(第一次声明时),赋值给变量,作为参数传递给函数,或者作为函数结果返回。A closure is one way of supporting first-class functions; it is an expression that can reference variables within its scope (when it was first declared), be assigned to a variable, be passed as an argument to a function, or be returned as a function result.
- 或者,闭包是一个堆栈框架,当函数开始执行时,它被分配,而在函数返回后不会释放(就像在堆栈上而不是堆栈上分配了一个“堆栈帧”)。Or, a closure is a stack frame which is allocated when a function starts its execution, and not freed after the function returns (as if a 'stack frame' were allocated on the heap rather than the stack!).
下面这段代码就是函数的引用:
function sayHello2(name){
var text ='hello'+name;//Local variable
var say = function(){
console.log(text);
}
return say;
}
var say2 = sayHello2('Bob');
say2(); //logs "Hello Bob"
网友评论