Javascript闭包简单理解
提到闭包,想必大家都早有耳闻,下面说下我的简单理解。
说实话平时工作中实际手动写闭包的场景并不多,但是项目中用到的第三方框架和组件或多或少用到了闭包。
所以,了解闭包是非常必要的。呵呵...
一、什么是闭包
简而言之,就是能够读取其他函数内部变量的函数。
由于JS变量作用域的特性,外部不能访问内部变量,内部可以外部变量。
二、使用场景
1. 实现私有成员。
2. 保护命名空间,避免污染全局变量。
3. 缓存变量。
先看一个封装的例子:
var person = function () {// 变量作用域为函数内部,外部无法访问var name = "default";return {getName: function () {return name;},setName: function (newName) {name = newName;}} }();console.log(person.name); // 直接访问,结果为:undefined console.log(person.getName()); // 结果为:default console.log(person.setName("langjt")); console.log(person.getName()); // 结果为:langjt
再看循环中常用闭包解决引用外部变量问题:
var aLi = document.getElementsByTagName('li'); for (var i=0, len=aLi.length; i<len; i++) {aLi[i].onclick = function() {alert(i); // 无论点击哪个<li>元素,弹出的值都为len,表明这里的i和在for之后打印i的值是一样的。 }; }
使用闭包后:
var aLi = document.getElementsByTagName('li'); for (var i=0, len=aLi.length; i<len; i++) {aLi[i].onclick = (function(i) {return function() {alert(i); // 此时点击<li>元素,就会弹出对应的下标了。 }})(i); }
三、注意事项
1. 内存泄漏
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题。
比如:
function foo() {var oDiv = document.getElementById(‘J_DIV’);var id = oDiv.id;oDiv.onclick = function() {// alert(oDiv.id); 这里存在循环引用,IE低版本页面关闭后oDiv仍在内存中。所以尽可能缓存基本类型而不是对象。 alert(id);}; oDiv = null; }
2. 变量命名
如果内部函数的变量和外部函数的变量名相同时,那么内部函数再也无法指向外部函数那个同名的变量。
比如:
function foo(num) {return function(num) {console.log(num); } } var f = new foo(9); f(); // undefined
其实上面的用法,专业术语叫函数柯里化(Currying),就是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。本质上也利用了闭包可以缓存的特性,比如:
var adder = function(num) {return function(y) {return num+y;}; };var inc = adder(1); var dec = adder(-1); //inc, dec现在是两个新的函数,作用是将传入的参数值 (+/‐)1 alert(inc(99));//100 alert(dec(101));//100 alert(adder(100)(2));//102 alert(adder(2)(100));//102
再比如阿里玉伯的seaJS源码中:
/*** util-lang.js - The minimal language enhancement*/ function isType(type) {return function(obj) {return {}.toString.call(obj) == "[object " + type + "]"} }var isObject = isType("Object"); var isString = isType("String");
转载于:https://www.cnblogs.com/lonelyxmas/p/4225437.html
Javascript闭包简单理解相关推荐
- 关于Javascript闭包的理解
一.什么是闭包? "官方"的解释是:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 相 ...
- JavaScript闭包函数理解
JavaScript闭包 一.变量的作用域: 要理解闭包,首先必须理解JavaScript特殊的变量作用域. 变量作用域无非就是两种:全局变量 和 局部变量. JavaScrip ...
- javascript闭包的理解
javascript闭包是javascript的难点,很多人对js闭包不是很理解,我对js闭包一开始也是云里雾里,我刚刚进兴安得力的时候,做的转正试题中就有一个对闭包理解的题目.如何理解javascr ...
- javascript闭包简单实例
1 闭包实例 下图是一个闭包实例: <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- JavaScript闭包简单应用
闭包定义 在JavaScript中,当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包.简单说,闭包就是能够读取其他函数内部变量的函数. 闭包的作用: 1. 可以读取函数内部的变量 2. 让 ...
- 对javascript闭包的理解
在 JavaScript 中,闭包是一个让人很难弄懂的概念.ECMAScript 中给闭包的定义是:闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量. 是不是看完 ...
- 关于Javascript闭包的理解(二)
先看看闭包的科学的定义:闭包是可以包含自由(未绑定)变量的代码块:这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义."闭包" 一词来源于以下两者的结 ...
- 浅谈对JavaScript闭包的理解
首先我们先来看一段代码 从上面的代码可以看出js都有一个特性特性,局部方法可以访问外部父类方法的属性,也就是说,子类或子方法可以访问父类的资源. 我们再来看一段代码 为什么我们打印出来的是undefi ...
- 深入理解Javascript闭包(一)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用于.变量作用域包括 ...
最新文章
- R语言plotly可视化:plotly可视化箱图、相同数据集对比使用不同分位数算法的可视化差异(quartilemethod参数、linear、inclusive、exclusive)
- C语言实现链式栈(LinkStack)
- 浅谈XXE漏洞攻击与防御——本质上就是注入,盗取数据用
- WPF 触发器Triggers
- Dubbo监控中心Windows安装
- 20170710L07-09-03老男孩Linux运维实战培训-Sersync实时同步软件实战应用指南07
- 思科认证36个热门考点汇总
- Linux 开发者最应该知道的命令汇总
- 1.8 编程基础之多维数组 08 矩阵加法 python
- JAVA的sleep
- jquery相对定位(包含find的使用 find相当于后代选择器)$(选择器1,选择器2)
- python网盘系统_Python最新全套视频教程百度网盘资源
- 数据可视化的优势有哪些
- guid会不会重复_最笨的方法也许是最快的方法,量变到质变,首先要做的是不断重复...
- ambari 搭建hadoop大数据平台系列4-配置ambari-server
- 关于ColorPicker颜色拾取器的使用方法
- 【机器学习】第一章 - 机器学习概论 - 周志华机器学习笔记
- QQGame找茬游戏辅助工具
- 什么是“系统空闲进程”,为什么使用那么多的CPU?
- Web前端开发技术课程大作业——南京旅游景点介绍网页代码html+css+javascript
热门文章
- LED液晶显示屏自动扫描测试软件特点,led显示屏控制软件自动校正是什么作用?...
- linux嵌入式如何学习,嵌入式Linux要如何学习?嵌入式linux学习路线讲解
- java io教程_Java IO教程
- hello world_AngularJS Hello World示例
- java 下划线_Java SE 9:“ _”(下划线)更改
- node js 非阻塞io_Node Express JS:套接字IO模块示例
- 微信端自动授权登陆实现 - 无第三方库版
- centos安装Gitlab Runner
- Spring+SpringMVC+mybatis+Quartz整合
- linux资源限制函数getrlimit,setrlimit(转载)【转】