什么是JavaScript闭包?

刚开始知道这个词,就误以为是自动执行的匿名函数块。
比如说+function(){}();
然而并不是,那么请看下面的例子:

function init() {
var name = "initial";
function displayName() {//displayName() is the inner function, a closure
alert(name);
}
displayName();
}
init();

displayname()是闭包吗?函数内部访问函数成员局部属性的方法?

This is an example of lexical scoping: in JavaScript, the scope of a variable is defined by its location within the source code (it is apparent lexically) and nested functions have access to variables declared in their outer scope

这是一个词法域的例子:Javascript中,变量的作用域由他所在的代码区域(明显的词法上的),和可以访问外部作用域的嵌套方法组成。

闭包Closure

再看这个例子:

function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
} var myFunc = makeFunc();
myFunc();

What’s different — and interesting — is that the displayName() inner function was returned from the outer function before being executed.
不同并且有趣的地方是:内部方法displayName在函数外面被return出来,还是在执行之前。
那么可以大胆的说:myFunc就是一个闭包。

A closure is a special kind of object that combines two things: a function, and the environment in which that function was created.
闭包就是一个包含了两个东西的特殊对象:一个方法和创建这个方法的环境。
再看看一个例子 :

function makeAdder(x) {
return function(y) {
return x + y;
};
} var add5 = makeAdder(5);
var add10 = makeAdder(10); console.log(add5(2)); // 7
console.log(add10(2)); // 12

显然add5和add10各自都有各自的环境,所持有的变量是不同的。
看一个闭包引起的错误,比较难理解透。

function showHelp(help) {
document.getElementById('help').innerHTML = help;
} function setupHelp() {
var helpText = [
{'id': 'email', 'help': 'Your e-mail address'},
{'id': 'name', 'help': 'Your full name'},
{'id': 'age', 'help': 'Your age (you must be over 16)'}
]; for (var i = 0; i < helpText.length; i++) {
var item = helpText[i];
document.getElementById(item.id).onfocus = function() {
showHelp(item.help);
}
}
} setupHelp();

如果有三个输入框,那么每个框点击都会导致#help的内容变成Your age (you must be over 16)。
原因是:赋值给document.getElementById(item.id).onfocus
的function是个闭包函数:,这里循环创建了三个闭包,但是他们共享了同一个外部作用域,也就是setupHelp,那么自然循环结束的时候,onfocus 里面就是指向了数据的最后一个元素。
这些话并不太容易让人相信。

我debug跟踪了一下:
循环走完的时候,onfocus function(){}里面 item 的id已经是’age’,help是
‘Your age (you must be over 16)’

三个input对象都是onfocus绑定了同一个闭包(等同于同一个,环境里变量和函数行为都一样)。

闭包性能

通常一个函数执行完毕之后它内部的局部变量就已经不能再访问了。
而闭包需要维持他所被创建时的作用域环境,过分使用闭包对速度上的性能和内部的消耗是有影响的。没必要的时候不要使用闭包。

本文引用自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

探究JavaScript闭包的更多相关文章

  1. JavaScript闭包深入解析

    for (var i=1; i<=5; i++) { setTimeout( function timer() { console.log( i ); }, i*1000 ); } --上面这段 ...

  2. Javascript闭包的一些研究

    原文:Javascript闭包的一些研究 本文不谈闭包的概念,因为概念容易把人搞晕,本文希望通过几个鲜活的例子来探究闭包的性质,相信对理解闭包会有所帮助. 程序1 var f = (function( ...

  3. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  4. JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  5. JavaScript闭包(Closure)

    JavaScript闭包(Closure) 本文收集了多本书里对JavaScript闭包(Closure)的解释,或许会对理解闭包有一定帮助. <你不知道的JavsScript> Java ...

  6. Javascript闭包和C#匿名函数对比分析

    C#中引入匿名函数,多少都是受到Javascript的闭包语法和面向函数编程语言的影响.人们发现,在表达式中直接编写函数代码是一种普遍存在的需求,这种语法将比那种必须在某个特定地方定义函数的方式灵活和 ...

  7. javascript闭包理解

    //闭包理解一 function superFun(){ var _super_a='a'; function subfuc(){ console.log(_super_a); } return su ...

  8. Javascript闭包深入解析及实现方法

    1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点:1. 作为一个函数变量的一个引用,当函数返回时 ...

  9. javascript闭包和作用域链

    最近在学习前端知识,看到javascript闭包这里总是云里雾里.于是翻阅了好多资料记录下来本人对闭包的理解. 首先,什么是闭包?看了各位大牛的定义和描述各式各样,我个人认为最容易一种说法: 外部函数 ...

随机推荐

  1. MIT FiveK图像转化--DNG到TIFF,TIFF到JPEG

    MIT FiveK图像转化--DNG到TIFF,TIFF到JPEG MIT FiveK数据库是研究图像自动修饰算法会用到的基准数据库,然而那个网页上提供给我们的5000张原始图像的格式为DNG格式(一 ...

  2. Java基础系列-深入理解==和equals的区别(一)

    一.前言 说到==和equals的问题,面试的时候可能经常被问题到,有时候如果你真的没有搞清楚里边的原因,被面试官一顿绕就懵了,所以今天我们也来彻底了解一下这个知识点. 二.==和equals的作用 ...

  3. ajax发送PUT请求,使用HttpPutFormContentFilter过滤器接受办法

    相信在使用ajax发送put请求时候,肯定遇到过后端数据无法被接受到的405错误. 为什么会遇到这个问题? 1.首先查看Tomcat源码 关于如何将数据封装到Request public class ...

  4. Tomcat 报错 The APR based Apache Tomcat Native library which allows optimal performance in production environmen

    这个问题在我一次重新装了tomcat和myeclipse时出现 说实话 出现这个问题头大 但是好在解决了 美滋滋 最开始到处寻找各种解决方案 最后直接注释了server.xml中的一行 直接解决这个报 ...

  5. Scala Class etc.

    Classes 一个源文件可包含多个类,每个类默认都是 public 类字段必须初始化,编译后默认是 private,自动生成 public 的 getter/setter :Person 示例 pr ...

  6. linux mint安装ffmpge

    sudo add-apt-repository ppa:mc3man/trusty-media sudo apt-get update sudo apt-get install ffmpeg

  7. java8 Optional使用总结

    [前言] java8新特性 java8 函数接口 java8 lambda表达式 Java 8 时间日期使用 java8 推出的Optional的目的就是为了杜绝空指针异常,帮助开发者开发出更优雅的代 ...

  8. eclipse与hadoop集成,运行wordCount1

    搭好了hadoop集群之后,就该使用它了 第一步:下载hadoop eclipse的插件,将它放到eclipse\plugins的目录下,然后重启eclipse,点击windows->show ...

  9. plsql导入导出表结构和数据对象

    一.Tools的导出表结构:export User objects 二.Tools的Export Tables选项 导出表数据:export tables (选择:exp.exe) 三. 导入表结构: ...

  10. html5一些特性

    html5可以理解为html+css+js 其目前可以解决:1.浏览器的兼容问题 2.统一web应用标准 3.解决文档结构定义不明确问题 4.解决web应用中的功能受限问题 5.是程序员编写的web应 ...