JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)
function my(){
}
my(); //别忘记调用
(function(){ //这里第一个左括号是必须的,如果不写,JavaScript解析器会将
//function解析成函数声明语句,使用的话解析成函数定义表达式
}()) //这里的()的作用是,函数定义完毕后立即调用它。
function a(){
var a1=2;
}
function b(){
var b1=3;
}
function b(){
var b1=3;
function a(){
var a1=2;
alert(b1);
}
a();
}
b(); //结果=>3
这样就实现了?然并卵啊!闭包的现实意义在哪?当然“真正”有意义的闭包并不是这样。
闭包的作用:外部函数可以读取函数内部的变量。
另一个就是让这些变量的值始终保持在内存中。
function b(){
var b1=3;
return function (z){
var a1=2;
return alert(b1+z);
}
}
var a=b();
a(2); //=>5
这样我们就在全局作用域中调用了b1这个内部变量。(个人理解,如果有误还请指教。)
匿名函数被返回后,它的作用域链被初始化为包含b()函数的活动对象和全局变量对象。这样匿名函数就可以访问b()中的所有变量。
function ca(){
var arry=[];
for(var i=0;i<10;i++){
arry[i]=function(){
return i;
}
}
return arry;
}
function ca(){
var arry=[];
for(var i=0;i<10;i++){
arry[i]=function(num){
return function(){
return num;
}
}
}
return console.log(arry);
}
ca();
上面强制闭包错误!返回的都是function(num){}。
下面提供正确的方式:
//第一种方式
function ca(){
var arry=[];
for(var i=0;i<10;i++){
arry[i]=(function(i){
return i;
})(i);
}
return console.log(arry[5]);;
}
ca();
//->5
//第二种方式
function ca(){
var arry=[];
for(var i=0;i<10;i++){
arry[i]=function(){
var n=i;
return n;
}();
}
return console.log(arry[8]);
}
ca();
//->5
我们没有直接把闭包函数赋值给数组,而是定义了一个匿名函数,并将立即执行该匿名函数的结果赋值给数组。
这两种方式都能得到自己想要的结果。
这里在举个实际中的例子:
<!doctype html>
<title></title>
<meta charset="utf-8"/>
<script type="text/javascript">
window.onload = function(){ //方法一
var lists = document.getElementsByTagName("li");
for(var i=0,l=lists.length; i < l; i++){
lists[i].onclick=(function(i){// 强制闭包
return function(){
alert(i)
}
})(i)
} //方法二
var lists = document.getElementsByTagName("li");
for(var i=0,l=lists.length; i < l; i++){
lists[i].onclick=function(){
var n=i;
return function(){
alert(n)
}
}()
}
}
</script>
<ul>
<li id="a1">aa</li>
<li id="a2">aa</li>
<li id="a3">aa</li>
</ul>
var f=new Fuction("x","y","return x*y;");
//->等价于
var f=function(x,y){
return x*y
}
5.constructor属性
var F=function(){} //这是一个函数对象
var p=F.prototype; //这是F相关联的原型对象
var c=p.constructor; //true
c===F //对于任意函数F.prototype.constructor==F
var o=new F(); //创建类F的一个对象
o.constructor===F //true,constructor属性指代这个类
6.多catch从句
try{
//这里肯呢个会抛出多种类型异常
throw 1;
}
catch(e if e instanceof ReferenceError){
//这里处理引用错误
}
catch(e if e==="quit"){
//这里处理抛出的字符串是"quit"的情况
}
catch(e if typeof e==="string"){
//处理其他字符串的情况
}
catch(e){
//处理剩下的异常
}
finally{
//finally从句正常执行
}
--Log----------------------------------------------------------------------------------------------
2015-10-21 添加操作 闭包
JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)的更多相关文章
- JavaScript权威设计--跨域,XMLHttpRequest(简要学习笔记十九)
1.跨域指的是什么? URL 说明 是否允许通信 http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a. ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- JavaScript权威设计--JavaScript函数(简要学习笔记十)
1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"lik ...
- java jvm学习笔记十二(访问控制器的栈校验机制)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...
- (C/C++学习笔记) 十二. 指针
十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...
- Python学习笔记(十二)—Python3中pip包管理工具的安装【转】
本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...
- JavaScript权威设计--Window对象之Iframe(简要学习笔记十四)
1.Window对象属性的文档元素(id) 如果在HTML文档中用id属性来为元素命名,并且如果Window对象没有此名字的属性,Window对象会赋予一个属性,它的名字是id属性的值,而他们的值指向 ...
- JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)
1.事件冒泡与事件捕获 2.事件与事件句柄 3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处: 1.每个函 ...
随机推荐
- EntityFramework之DetectChanges's Secrets(三)(我为EF正名)
前言 对于应用程序开发者来说,通常不需要考虑太多对于Entity Framework中的变更追踪(change tracking),但是变更追踪和DetectChanges方法是栈的一部分,在这其中, ...
- .Net Core上也可以使用的二维码组件
我Fork了QRCoder,并且兼容了.Net Core,图形库用的是ZKWeb.System.Drawing Github: https://github.com/zkweb-framework/Q ...
- php实现的分页类
php分页类文件: <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 pr ...
- Spring(三)__aop编程
aop( aspect oriented programming ) 面向切面编程,是对所有对象或者是一类对象编程 几个重要的概念: 1.切面(aspect):要实现的交叉功能,是系统模块化的一个切面 ...
- win10安装blueCFD
blueCFD其实安装起来听简单,不过还是有点问题.最大的问题是该软件没有文档,不过想来也是,人家只是提供一个linux外壳,剩下的工作还是OpenFoam,该干嘛干嘛,也用不着文档.问题在于我们需要 ...
- 借助 SIMD 数据布局模板和数据预处理提高 SIMD 在动画中的使用效率
原文链接 简介 为发挥 SIMD1 的最大作用,除了对其进行矢量化处理2外,我们还需作出其他努力.可以尝试为循环添加 #pragma omp simd3,查看编译器是否成功进行矢量化,如果性能有所提升 ...
- JS中给正则表达式加变量
前不久同事询问我js里面怎么给正则中添加变量的问题,遂写篇博客记录下. 一.字面量 其实当我们定义一个字符串,一个数组,一个对象等等的时候,我们习惯用字面量来定义,例如: var s = &quo ...
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- PE Checksum Algorithm的较简实现
这篇BLOG是我很早以前写的,因为现在搬移到CNBLOGS了,经过整理后重新发出来. 工作之前的几年一直都在搞计算机安全/病毒相关的东西(纯学习,不作恶),其中PE文件格式是必须知识.有些PE文件,比 ...
- 锤子OneStep及BigBang使用体验
令人期待的Smartisan OS v3.1.2终于推送了,第一时间下载了更新.几乎花了半个小时才升级完毕,捧着还热乎的手机,赶忙体验一下传说中的两大杀器:OneStep以及BigBang. 先说On ...