javascript ECMAScript-闭包
来源:互联网 发布:golang 2.0 编辑:程序博客网 时间:2024/05/21 05:41
前面总结的很简单。需要有一定javascript的语法基础。如果有不对的地方,还请指正。
闭包
首先,我们先来聊一聊作用域 ,作用域,是一种环境,变量所处的环境,一个function(){} 会创建一个作用域,
<pre name="code" class="javascript">var a = 10;function test(){var a = 20;return a;}var b = test(a);alert(a);//10alert(b);//20上面的栗子中,全局变量 a 和 函数内变量 a 是两个不同的变量,输出的是两个不同的值
var a = 10;function test(){<span style="white-space:pre"></span> a = 20;return a;}var b = test(a);alert(a);//20
<pre name="code" class="javascript">alert(b);//20这个栗子却输出了20,前面说过,没有var关键字,会被赋值到window对象上,所以他们相当于两次赋值 ,那么问题来了,函数内的作用域是一个环境,怎么能用全局环境的值呢?
这里就要说一说延长作用域链,当一个变量在当前环境内没有找到声明时,会沿着作用域链访问活动对象,这是栗子中,window对象,就是test函数t的活动对象,变量a没有在函数内声明,他会访问活动对象,如果没有找到。返回undefined。
到了这里,我们就要说一说今天的猪脚。闭包。函数有自己的作用域,这个作用域,通过外部是访问不到的。栗子
var a = 10;function test(){var b = 20;}alert(a);//10
alert(b);//error函数执行到alert(b)的时候。报错了,因为找不到变量b,作用域可以向上查找,但是不能反方向查找,这一点要牢记。
那么,我们如何访问变量b呢 :栗子
var a = 10;function test(){ var b = 20; return b;}alert(a);//// alert(b);这里我们注释了alert(test());没错,就是return ,函数返回了变量b,当然,如果你alert(b),还是会报错,只不过,我们换了一个思路,调用函数,返回他的值。我们不需要变量名,而是他的值。
这就是闭包的一个简单的例子。 来个复杂的栗子
function test(){ var b = {num:20}; return { getNum:function(){ return b.num; }, setNum:function(num){ b.num = num; }, }}alert(test().getNum());//20test().setNum(30);alert(test().getNum());//30如果我们声明了一个对象,我不想别人直接操作他,而是给他两个方法,一个获得,一个设置。这样。我的对象就被保护起来。保证结构不被破坏,就像DOM和BOM提供的API一样。只是给了你一个调用的方法。这是一个闭包很好的作用。闭包,就说到这里,还有一些要点,被许多的大牛提到过,不再累述。如果有不对的地方,还请指正。
0 0
- javascript ECMAScript-闭包
- Javascript(ECMAScript )闭包(closure)
- ECMAScript 闭包(closure)
- ECMAScript 闭包(closure)
- JavaScript / ECMAScript
- javascript ECMAScript
- ECMAScript,javascript,jscript
- ECMAscript 对象 (javascript)
- 深入浅出JavaScript—ECMAScript
- JavaScript(02): ECMAScript基础
- javascript笔记 --- ECMAScript
- ECMAScript(JavaScript) 修改对象
- JavaScript(ECMAScript) switch 语句
- javascript ECMAScript 原型
- JavaScript历史与ECMAScript
- JavaScript 之 ECMAScript
- JavaScript的ECMAScript
- JavaScript与ECMAScript
- JavaScript 入门学习
- 使用myeclipse插入数据到mysql 出现中文乱码|utf8乱码解决方案[适合tomcat部署的jsp应用]
- 连连看--详解及实现
- #22 Flatten List
- 枚举集合--二进制法
- javascript ECMAScript-闭包
- java 流的复用
- 获取到百度天气
- studio 如何更改,查看或者修改jdk和sdk的路径
- set的用法
- #20 Dices Sum
- codevs 3327(dp+单调队列优化)---以此记录我的脑残经历
- 纯代码和Storyboard搭建Cell
- 软考之软件设计师考试大纲(2016下半年)