标签:return 使用方法 执行 创建 笔记 div 上下文环境 for 位置
闭包 : 函数可以访问它被创建时所处的上下文环境。---《JavaScript语言精粹》
产生原理: JavaScript中没有块级作用域,只有函数作用域,函数中任何位置定义的参数和变量在函数内的任何地方都是可见的,在函数外不可见。
使用方法: 可以通过在函数内部创建局部变量,实现变量的私有化。(外部不可见)
注意事项: 内部函数访问外部函数的变量时访问的是实际变量(值为外部函数返回时变量的值)。
知识点 : ①只要内部函数需要,外部函数中的变量不会在外部函数返回后销毁。(多了浪费内存)
②通过定义内部函数实现对内部变量信息的查询和修改,实现接口的暴露。
举个例子:
var myObject = (function(){ var value=0; return { getValue: function(){ return value; }, setValue: function(v){ if (typeof v === ‘number‘){ value = v; } } }; }());
这段代码得到一个myObject对象,包含两个方法,只有这两个方法可以获取或者修改value变量,没有其他办法可以访问到value变量。
这个value变量我们叫私有变量,这两个可以访问私有变量的共有方法就叫做特权方法。
再举个例子:
//构造一个函数,本义是通过内部函数返回一个函数数组,数组中每一项都是一个函数
//数组项函数会返回当前的数组索引 //但是最后每一项的函数都会得到返回10 var eg2 = function(){ var i, result = new Array(); for(i=0; i<10; i += 1){ result[i] = function(){ return i; } } return result; };
为什么最后数组中每一项的函数都会返回10呢?因为内部的匿名函数访问的是变量i而不是函数创建时i的值,在for循环执行完后变量i中保存的值为10,最后外部函数返回的result数组中的每一项的函数中返回的变量i的值也就为10。
可以修改成这样解决:
//在for循环之外创建一个辅助函数,返回一个会返回传入的值的函数 var eg2 = function(){ var result = new Array(); var helper = function(e){ return function(){ return e; } }; var i; for(i=0; i<10; i += 1){ result[i] = helper(i); } return result; };
在for循环中每次调用helper()函数时,传入变量i,由于函数参数是按值传递的,helper()就会将当前的变量i的值复制给局部变量e,然后返回一个会返回变量e的函数。
这里的变量e是每个数组项函数的局部变量,各自保存着各自不同的值。
标签:return 使用方法 执行 创建 笔记 div 上下文环境 for 位置
原文地址:http://www.cnblogs.com/Mr-thirteen/p/6233464.html