JavaScript闭包
来源:互联网 发布:vscode 运行npm命令 编辑:程序博客网 时间:2024/05/30 04:16
JavaScript闭包
闭包是指有权访问另一个函数作用域中的变量的函数。
创建闭包
创建闭包的常见方式就是在一个函数内部创建另一个函数
function createComparisonFunction(propertyName) { return function(object1, object2) { var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; } };}
其中,这两行代码是内部函数(一个匿名函数)中的代码,这两行代码访问了外部函数中的变量propertyName
var value1 = object1[propertyName];
var value2 = object2[propertyName];
能够访问这个变量的原因是:内部函数的作用域链中包含createComparisonFunction的作用域。
在匿名函数从createComparisonFunction()中被返回后,它的作用域链被初始化为包含createComparisonFunction函数的活动对象和全局变量对象。
createComparisonFunction函数在执行完毕后,其执行环境的作用域链会被销毁,但它的活动对象仍然会留在内存中。直到匿名函数被销毁后,createComparisonFunction的活动对象才会被销毁。
//创建函数var compareNames = createComparisonFunction("name");//调用函数var result = compareNames({ name: "Nicholas"}, { name: "Greg"});//解除对匿名函数的引用(以便释放内存)compareNames = null;
闭包与变量
闭包所保存的是整个变量对象,而不是某个特殊的变量。
function createFunctions(){ var result = new Array(); for (var i = 0; i < 10; i++) { result[i] = function () { return i; }; } return result}//result里的值全为10
通过创建另一个匿名函数强制让闭包的行为符合预期。
function createFunctions(){ var result = new Array(); for (var i = 0; i < 10; i++) { result[i] = function (num) { return function(){ return num; }; }(i); } return result;}console.log(createFunctions()[3]());//3
关于this对象
this
对象通常指向全局对象。 把外部作用域中的this对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了。
var name = "The Window";var object = { name: "My Object", getNameFunc: function() { var that = this; return function() { return that.name; }; }};console.log(object.getNameFunc()());//"My Object"
阅读全文
0 0
- 【JavaScript】Javascript闭包
- javascript的闭包javascript
- Javascript闭包演示javascript
- [ javascript ] javascript闭包测试!
- 【javascript】javascript中的闭包
- 【javascript】学习Javascript闭包
- 理解 JavaScript 闭包
- javascript 闭包
- javascript闭包
- Javascript闭包
- JavaScript中的"闭包"
- JavaScript 闭包
- javascript中的闭包
- 理解 JavaScript 闭包
- Javascript Closures[闭包]
- javascript闭包
- Javascript 闭包详解
- Javascript闭包技术
- Android 面试题 关于oom的解决方案
- Linux下优雅的让程序后台运行
- unique-paths
- hadoop关于dfs.datanode.data.dir下过个目录不均衡问题
- 为什么使用 Redis及其产品定位
- JavaScript闭包
- Cmder--Windows下命令行利器
- 轮播图
- 开关电源之升降压-如何得到输出电压的精确幅度
- Java高并发编程(三)
- java.lang.UnsatisfiedLinkError: E:\apache-tomcat-7.0.59\bin\tcnative-1.dll: Can't load IA 32-bit .dl
- mysql导入导出sql文件 window下 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u dbuser -p dbname >
- 欢迎使用CSDN-markdown编辑器
- leedcode