js中匿名函数
今天碰到一道题,里面既包含了匿名函数的知识,也包含了预编译,函数的传参(形参),感觉迷迷糊糊的,所以想着做个总结。
var foo={n:1};
(function(foo){
console.log(foo.n);
foo.n=3;
var foo={n:2};
console.log(foo.n);
})(foo);
console.log(foo.n);
上面的代码,可以写成这样,看解释
var foo={n:1};
(function(foo){ //此时形参和实参指向相同的内存空间,且空间的值n为1
var foo; //变量的提升,一个变量的声明优先级低于形参,so这行相当于无效
console.log(foo.n); //这里应当输出1
foo.n=3; //形参和实参的指向的内存空间发生了改变,值现在变为3
var foo={n:2}; //这行很关键,开辟了新的内存空间,n的值为2
console.log(foo.n); //由于js中的代码是自上而下执行,所以此时输出2
})(foo);
console.log(foo.n); //之前的内存空间值为3,所以输出3
结果输出 1 2 3
按照上面的思路,如果第五行和第六行换一下呢
var foo={n:1};
(function(foo){ //此时形参和实参指向相同的内存空间,且空间的值n为1
var foo; //变量的提升,一个变量的声明优先级低于形参,so这行相当于无效
console.log(foo.n); //这里应当输出1
var foo={n:2}; //这行很关键,开辟了新的内存空间和之前的已经断开联系,n的值为2
foo.n=3; //改变了新的内存空间里面的值,值现在变为3
console.log(foo.n); //由于js中的代码是自上而下执行,所以此时输出3
})(foo);
console.log(foo.n); //之前的内存空间值为1,所以输出1
结果输出 1 3 1
ok 那接下来这个呢
var foo={n:1};
(function(foo){ //此时形参和实参指向相同的内存空间,且空间的值n为1
var foo; //变量的提升,一个变量的声明优先级低于形参,so这行相当于无效
console.log(foo.n); //这里应当输出1
foo.n=3; //形参和实参的指向的内存空间发生了改变,值现在变为3
foo.n=2 //并没有开辟了新的内存空间,在原来的基础上修改的,n的值为2
console.log(foo.n); //由于js中的代码是自上而下执行,所以此时输出2
})(foo);
console.log(foo.n); //原始的的内存空间值经过修改变为2,所以输出2
结果输出 1 2 2
下面和上面一样了
var foo={n:1};
(function(foo){ //此时形参和实参指向相同的内存空间,且空间的值n为1
var foo; //变量的提升,一个变量的声明优先级低于形参,so这行相当于无效
console.log(foo.n); //这里应当输出1
foo.n=2; //形参和实参的指向的内存空间发生了改变,值现在变为2
foo.n=3; //并没有开辟了新的内存空间,在原来的基础上修改的,n的值为3
console.log(foo.n); //由于js中的代码是自上而下执行,所以此时输出3
})(foo);
console.log(foo.n); //原始的内存空间的值经过修改变为3,所以输出3
结果输出 1 3 3
那下面这个呢(第五行和第六行都改变了指向,由于并不是在原来的基础上修改的,所以最后输入的值不变)
var foo={n:1};
(function(foo){ //此时形参和实参指向相同的内存空间,且空间的值n为1
var foo; //变量的提升,一个变量的声明优先级低于形参,so这行相当于无效
console.log(foo.n); //这里应当输出1
var foo={n:2}; //开辟了新的内存空间,n的值为2
var foo={n:3}; //开辟了新的内存空间,n的值为3
console.log(foo.n); //由于js中的代码是自上而下执行,所以此时输出3
})(foo);
console.log(foo.n); //原始的内存空间的值为1,并没被有被修改,所以输出1
结果输出 1 3 1
这个就和上面的一样了
var foo={n:1};
(function(foo){ //此时形参和实参指向相同的内存空间,且空间的值n为1
var foo; //变量的提升,一个变量的声明优先级低于形参,so这行相当于无效
console.log(foo.n); //这里应当输出1
var foo={n:3}; //开辟了新的内存空间,n的值为3
var foo={n:2}; //开辟了新的内存空间,n的值为2
console.log(foo.n); //由于js中的代码是自上而下执行,所以此时输出2
})(foo);
console.log(foo.n); //原始的内存空间并未被修改,所以输出1
结果输出 1 2 1
以上为小弟解读,如果过错还请大神指教。
js中匿名函数的更多相关文章
- JS中匿名函数$(function(){ })和(function(){})()的区别
“$(function(){ });” Jquery语法的匿名函数,用于存放操作DOM对象的代码,执行其中代码时DOM对象已存在: (通过这样就可以在页面加载完成时通过ajax再异步加载一些数据) “ ...
- 总结下js中匿名函数的写法~好几天没写博客了。。。
小哥最近很是心烦啊,不仅仅要继续以现任前端小白,未来前端攻城狮的身份苦逼学习,还要用剩余的时间去完成毕业设计.早知如此,当初我为毛要报考数学这么个苦逼专业....昨天一整天的时间在研究毕设,感觉代码已 ...
- js中匿名函数和回调函数
匿名函数: 通过这种方式定义的函数:(没有名字的函数) 作用:当它不被赋值给变量单独使用的时候 1.将匿名函数作为参数传递给其他函数 2.定义某个匿名函数来执行某些一次性任务 var f = func ...
- js中匿名函数的N种写法
匿名函数没有实际名字,也没有指针,怎么执行? 关于匿名函数写法,很发散~ +号是让函数声明转换为函数表达式.汇总一下 最常见的用法: 代码如下: (function() { alert('water ...
- js中的函数,Date对象,Math对象和数组对象
函数就是完成某个功能的一组语句,js中的函数由关键字 function + 函数名 + 一组参数定义;函数在定义后可以被重复调用,通常将常用的功能写成一个函数,利用函数可以使代码的组织结构更多清晰. ...
- JS中的函数、Bom、DOM及JS事件
本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的 ...
- node.js 中回调函数callback(转载),说的很清楚,看一遍就理解了
最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: 复制代码 代码如下: app.use(fu ...
- JS中的函数、BOM和DOM操作
一.JS中的函数 [关于注释] /** [文档注释]:开头两个*.写在函数上方,在调用函数时可以看到文档上方的描述信息. */ // 单行注释 /* 多行注释 */ 1.函数的声明及调用 (1) ...
- html css <input> javaScript .数据类型 JS中的函数编写方式 BOM总结 DOM总结
Day27 html css div 块标签. 特点: 独占一行,有高度和宽度 span 行元素. 特点:在同一行显示,当前行满了自动去下一行显示. 不识别高度和宽度 1.1.1.1 2.输入域标签 ...
随机推荐
- nyoj_118:修路方案(次小生成树)
题目链接 题意,判断次小生成树与最小生成树的权值和是否相等. 豆丁文档-- A-star和第k短路和次小生成树和Yen和MPS寻路算法 法一: 先求一次最小生成树,将这棵树上的边加入一个向量中,再判断 ...
- 浅谈Nginx负载均衡原理与实现
1.Nginx能做什么? Nginx可以两件事: -- HTTP请求 经过官方测试Nginx可以承受5万的并发量.可用来做静态资源的图片服务器 --负载均衡,如下解释什么是负载均衡. 2.负载均衡 ...
- 回味Python2.7——笔记2
一.模块 模块是包括 Python 定义和声明的文件.文件名就是模块名加上 .py 后缀.模块的模块名(做为一个字符串)可以由全局变量 __name__ 得到. 1. 模块可以导入其他的模块. 一个( ...
- ibatis 参数和结果的映射处理
SqlMapClient对象 这个对象是iBatis操作数据库的接口(执行CRUD等操作),它也可以执行事务管理等操作.这个类是我们使用iBATIS的最主要的类.它是线程安全的.通常,将它定义为单例. ...
- ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程”的异常
简单说明:我们开发时多人开发,会频繁访问服务器数据库,结果当连接数大的时候,就会报ora-12516的错误,ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程"的异常 ...
- 一步一步深入理解Dijkstra算法
先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...
- 【viewport】移动设备的兼容性问题
前段时间用微信开发者工具重构一个菜单项目的时候发现iphoneSE显示不全以及布局错乱的问题,找到了一个简单粗暴的解决方法. 移动设备上的viewport分为layout viewport ...
- Java 编程 订单、支付、退款、发货、退货等编号主动生成类
订单.支付.退款.发货.退货等编号主动生成类 在商城网站中,订单编号的自动生成,ERP中各个单据的编号自动生成,都可以按照一下的方式来自动生成. 第一步:定义常量订单编号前缀.订单编号起始数.订单编号 ...
- webpack模块解析
前面的话 在web存在多种支持JavaScript模块化的工具(如requirejs和r.js),这些工具各有优势和限制.webpack基于从这些系统获得的经验教训,并将模块的概念应用于项目中的任何文 ...
- IoC是什么
IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传 ...