【JS笔记】闭包
首先看执行环境和作用域的概念。执行环境定义了变量或函数有权访问的其他数据,决定它们的行为,每个执行环境都有一个与其关联的变量对象,保存执行环境中定义的变量。当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的最前是当前执行的代码所在环境的变量对象,下一个是外部环境的变量对象,再下一个就是下一个外部环境,一直延续到全局环境。标识符的解析沿着作用域链一级一级查找,直到找到标识符为止。
而闭包就是是只有权访问另一个函数作用域中的变量的函数。创建方法是在函数内部创建另一个函数。
当某个函数被调用时,会创建一个执行环境及相应的作用域链,排在作用域链前端的就是当前函数创建的活动对象,第二为是外部函数的活动对象,直到全局环境。每个执行环境都有一个变量对象,全局环境的变量对象始终存在,局部环境的变量对象只在函数执行过程中存在。一般在函数执行完后,局部活动对象就会被销毁,内存中只保留全局环境的变量对象。但当在一个函数内部定义另一个函数时,内部函数会将外部函数的活动对象添加到它的作用域链中。高级程序设计中的例子:
function createFunction(proertyName){
return function(obj1,obj2){
var value1=obj1[propertyName];
var value2=obj2[propertyName];
if(value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else{
return 0;
}
};
}
匿名函数被返回后,他的作用域链包含了createFunction的活动对象,createFunction执行完毕后,其活动对象不会被销毁,仍然保存在内存当中。
坏的影响:
仍然是高级程序设计里的例子
var creatFunction=function () {
var result =[];
for (var i = 0; i < 10; i++) {
result[i]=function () {
return i;
};
}
return result;
}
var a = creatFunction();
for (var i = 0; i < a.length; i++) {
console.log( a[i]()); //10 10 10......
};
解决方法是进行传参:
var creatFunction=function () {
var result =[];
for (var i = 0; i < 10; i++) {
result[i]=function (num) {
return function(){
return num;
};
}(i);
}
return result;
}
var a = creatFunction();
for (var i = 0; i < a.length; i++) {
var b = a[i];
console.log(b())
};
可以利用闭包创建特权方法,访问函数的私有变量。
function Foo(){
var n=10;
this.returnN=function(){
return n;
};
};
var newfoo=new Foo();
console.log(newfoo.returnN())//10
【JS笔记】闭包的更多相关文章
- 关于js中闭包的理解
1.以前很不理解js中闭包的概念及使用,下面来看一下 function foo() { var a = 123; var b = 456; return function () { return a; ...
- js的闭包
一,关于js闭包的只是感觉很高大上似乎,对于学弱来说任何问题都是这样的,值得去钻研和提高. 资料上理解的都是关于js的闭包其实就是js的变量的作用域的灵活使用. 函数内部定义变量的时候,一定要用 va ...
- 彻底搞清js中闭包(Closure)的概念
js中闭包这个概念对于初学js的同学来说, 会比较陌生, 有些难以理解, 理解起来非常模糊. 今天就和大家一起来探讨一下这个玩意. 相信大家在看完后, 心中的迷惑会迎然而解. 闭包概念: 闭包就是有权 ...
- 理解运用JS的闭包、高阶函数、柯里化
JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性. 这里就整理一些,做个总结. 一.闭包 1. 闭包的概念 闭包与执行上下文.环境.作用域息息相关 执 ...
- JS的闭包、高阶函数、柯里化
本文原链接:https://cloud.tencent.com/developer/article/1326958 https://cloud.tencent.com/developer/articl ...
- 关于js的闭包和复制对象
一.有关js的闭包 1.概念:所谓的闭包,就是指的两个作用域,其中内层作用于可以访问外层作用域的函数的现象 2.简单应用 for(var i = 0;i< lis.lenth;i++){ (fu ...
- JS的闭包问题
1.什么是“闭包” 是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 2.闭包的应用场景 (1)保护变量的安全实现JS私有属性和私有方法 (2)在 ...
- Data Visualization and D3.js 笔记(1)
课程地址: https://classroom.udacity.com/courses/ud507 什么是数据可视化? 高效传达一个故事/概念,探索数据的pattern 通过颜色.尺寸.形式在视觉上表 ...
- js笔记-0
#js笔记-0 数组: indexOf方法: Array也可以通过indexOf()来搜索一个指定的元素的位置: var arr = [10, 20, '30', 'xyz']; arr.indexO ...
- [学习笔记]JS中闭包的理解
一.闭包概念的理解 闭包,又称为词法闭包或函数闭包指引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外. 自由变量:该变量既不是函数本身定义的也不是函数 ...
随机推荐
- 围绕react衍生出来的思考
优势一.声明式开发 首先react是声明式的开发方式,这个与之对应的是命令式开发方式,之前在用jquery写代码的时候,都是直接来操作dom,直接操作dom的这种编程方式,我们把他叫做命令式的编程,也 ...
- 一个简单示例看懂.Net 并行编程
此示例尽量以最简洁的代码演示并行处理的功能,此示例代码中分别用单线程和多线程分别执行5次耗时1秒的操作.打印出执行过程及耗时. 以下为示例代码,.net framework要求4.0以上. using ...
- Django ORM之QuerySet方法大全
################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...
- javascript对字符串的常见操作trim,ltrim,rtrim,isEmpty,isFloat等
1.验证字符串是否为空格.是否包含非法字符. //验证是否字符串有非法字符 function v_invalide_char(value,msg){ var arr = ['#','@','!','$ ...
- Rest API 开发 学习笔记
概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着不断获取资源的表示方式,客户端应用 ...
- 使用TestFlight测试时候相关内容
前言:记录一下使用TestFlight测试时候相关内容 场景:在我们添加测试员:给测试员发送了邀请:测试员使用TestFlight的时候,其实是有崩溃的次数的记录的,相应的崩溃的信息也是可以查询到的. ...
- C#实现打印
C#实现导出pdf文件,打印 using System; using System.Collections.Generic; using System.Linq; using System.Web; ...
- rest_framework --- APIView
一.什么是rest_framework 它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架. 安装方式有很多种,可以通过pip,或者在pycharm中安装也可以 二.APIVie ...
- jwplayer 参数记录
jwplayer().getPosition()://播放了多少秒 jwplayer('playerdiv').play(); || jwplayer(0).play(true/false); // ...
- flex 遇到white-space:nowrap
背景,做一个前面图片宽度固定,后面宽度自适应,使用到了flex布局,但是想让后面div里文字不换行,超出以点点表示时,这时布局就乱了,查了下,原来flex布局与white-space:nowrap有影 ...