理解闭包
来源:互联网 发布:淘宝ysl口红领券200 编辑:程序博客网 时间:2024/06/16 14:37
(参考了JavaScript高级程序设计与汤姆大叔博客)
当在函数内部定义了其他函数时,就创建了闭包
有权访问另一个函数作用域的变量的函数。
1. 在后台执行环境中,闭包的作用域链分析:
自己的作用域、包含它的函数作用域、全局作用域
- 函数的作用域及其所有变量都会在函数执行结束后被销毁。但函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止。
- 闭包的利用
闭包实例
//比较函数function createComparison(propertyName) { return function (obj1, obj2) { var item1 = obj1[propertyName]; var item2 = obj2[propertyName]; if (item1 < item2) return -1; if (item1 > item2) return 1; if (item1 == item2) return 0; }}//比较namevar compare = createComparison("name");var result = compare({ name: "d", age: 20 }, { name: "c", age: 27 }); // 1
var x = 10;function foo() { alert(x);}(function () { var x = 20; foo(); // 10, but not 20})();
var x= 20; 在foo( )执行时的作用域不能访问到。
var x = 10;function foo() { var y = 20; function barFD() { // 函数声明 alert(x); alert(y); } var barFE = function () { // 函数表达式 alert(x); alert(y); }; var barFn = Function('alert(x); alert(y);'); barFD(); // 10, 20 barFE(); // 10, 20 barFn(); // 10, "y" is not defined}foo();
var data = [];for (var k = 0; k < 3; k++) { data[k] = function () { alert(k); };}data[0](); // 3, 而不是0data[1](); // 3, 而不是1data[2](); // 3, 而不是2
var data = [];for (var k = 0; k < 3; k++) { data[k] = (function _helper(x) { return function () { alert(x); }; })(k); // 传入"k"值}// 现在结果是正确的了data[0](); // 0data[1](); // 1data[2](); // 2
0 0
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- javascript 闭包理解
- 深刻理解闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 深入理解闭包
- 快速理解闭包
- 深入理解闭包
- 理解js闭包
- 理解 JavaScript 闭包
- 理解JavaScript 闭包
- 如何使用Maven和eclipse构建大数据开发框架项目
- Android应用程序私有目录下文件操作总结
- 类型转换
- How to fix no public key available for the following key IDs in debian
- 我准备开始考OCP 了
- 理解闭包
- 初识riot.js
- .net连接oracle数据库---Shinepans
- Apache Axis2 环境搭配详解
- 行参和实参的区别 原文说的是c++的 借鉴一下吧
- 天声人語
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Auto Layout 使用心得(一)—— 初体验
- hdu1715大菲波拉契数