js的事件处理与闭包:
var i = 0;
for(i=0;i<5;i++){
(function(i){
setTimeout(function(){alert(i)},3000);
})(i)
}
// 上面打印出的i的顺序是随机的
上面的这里的i指的是简单的数据类型,非引用类型。
=============================
var ss = 0;
var sss = {
age : 18,
a : {
age:28
}
}
function box(id){
var self = this;
self.ss++;
sss.age++;
sss.a.age++;
var ccc = $.extend({},sss);
(function(self,sss){
$(id).click(function(){
alert(self.ss+"sss=>"+sss.age+"sss.a=>"+sss.a.age);
});
})(self,ccc)
}
box('#box1');
box('#box2');
这里的var ccc = $.extend({},sss);指的是浅拷贝。
浅拷贝也是拷贝。
只是他默认把所有的数据类型的第一层都默认为简单的数据类型。
如果第一层中有引用类型,他也当简单的数据类型处理了。
var ccc = ssss;
这个不叫拷贝,也不叫浅拷贝,这个叫引用。
#box1 //1 19 30
#box2 //2 20 30
//====================
var ss = '';
function yan(bb){
ss = bb;
(function(ss){
setInterval(function(){
console.log(ss);
},2000);
})(ss)
} yan('a');
yan('b');
yan('c');
//==============
var ss1 = '';
function yan(bb1){
ss1 = bb1; setInterval(function(){
(function(ss1){
console.log(ss1);
})(ss1)
},2000); } yan('a1');
yan('b1');
yan('c1');
对于闭包的理解,函数中的函数,为什么闭包可以把,局部变量变为全局变量,因为,闭包是一个函数,函数可以操作变量,这个变量首先考虑就近的局部变量,这个函数最后返回,还是通过赋给window变量,都一样。我们通过调用这个函数,直接操作了局部变量,所以说局部变量变为了全局的。
js new的时候,会自动执行一次构造函数,并且,默认返回this(一般情况下this就是window,这句话有漏洞,或者说没有返回),如果,返回的不是this的话,如果是一个对象的话,那么也是一个新的对象。如果返回一个闭包的话,那么也是一个新的。
function box(config){
var self = this;
this.width = config.width;
this.height = config.height;
var defaultConfig = {
width: "100",
height:"100"
}
defaultConfig = $.extend(true, defaultConfig, config);
var detail = {
add:function(){
defaultConfig.width++;
},
log:function(){
alert(defaultConfig.width+" "+defaultConfig.height);
},
domain:function(){
alert(self.width+" "+self.height);
}
}
return detail;
}
如果不用New的话,
var a = box(config);
a.log();//200 300
a.domain();//200 300
var config = {
width:2000,
height:3000
}
var b = box(config);
b.log();//2000 3000
b.domain();//2000 3000
a.add();//200 300
a.domain();//2000 3000
如果用New的话
var config = {
width:200,
height:300
}
var a = new box(config);
a.log();//200 300
a.domain();//200 300
var config = {
width:2000,
height:3000
}
var b = new box(config);
b.log();//2000 3000
b.domain();//2000 3000
a.log();//200 300
a.domain();//200 300 这里是主要的差别
还有一点需要注意的。
随便写一个函数,函数中的this,指向window.
因为总体就是一个window对象,
所以一个变量就是window.变量
所以一个函数就是window.函数
函数里边this,也是window. 但是var就不是了。
js的事件处理与闭包:的更多相关文章
- zepto.js的事件处理
能够深入理解zepto对事件的处理,那么整个JS的事件处理就应该差不多合格了,事件处理是JS语言的一个难点. 1. 首先来看$.event函数. JS中有很多事件,都是已经定义好了,我们直接调用就可以 ...
- JS中的的"闭包"?深入Javascript之this
看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...
- js匿名函数和闭包总结
js匿名函数和闭包总结 一.总结 一句话总结:匿名函数的最主要作用是创建闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁.内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕.闭包可以用 ...
- JS之作用域与闭包
JS之作用域与闭包 作用域在JS中同样也是一个重要的概念.它不复杂,因为ES5中只有全局作用域和函数作用域,我们都知道他没有块级作用域.但在ES6中多了一个let,他可以保证外层块不受内层块的影响 ...
- js经典试题之闭包
js经典试题之闭包 1:以下代码输出的结果是? function Foo(){ var i=0; return function(){ document.write(i++); } } var f1= ...
- js基础知识:闭包,事件处理,原型
闭包:其实就是js代码在执行的时候会创建变量对象的一个作用域链,标识符解析的时候会沿着作用域链一级一级的网上搜索,最后到达全局变量停止.所以某个函数可以访问外层的局部变量和全局变量,但是访问不了里层的 ...
- 你不知道的JS之作用域和闭包(五)作用域闭包
原文:你不知道的js系列 一个简单粗暴的定义 闭包就是即使一个函数在它所在的词法作用域外部被执行,这个函数依然可以访问这个作用域. 比如: function foo() { var a = 2; fu ...
- 你不知道的JS之作用域和闭包(三)函数 vs. 块级作用域
原文:你不知道的js系列 在第(二)节中提到的,标识符在作用域中声明,这些作用域就像是一个容器,一个嵌套一个,这个嵌套关系是在代码编写时定义的. 那么到底是什么产生了一个新的作用域,只有函数能做到 ...
- 彻底弄懂js循环中的闭包问题
来源:http://www.108js.com/article/article1/10177.html?id=899 第一次接触这个问题还是在我刚开始学js的时候,当时就是一头雾水,时隔一年多了,突然 ...
随机推荐
- 20160916-3:mysql主从复制
一.什么是主从复制 将一个数据库节点的数据拷贝到一个或多个数据库节点(主节点—>从节点) 二.主从复制的原理 [简述]:将主节点上的变更操作存储到binlog,从节点建立了到主节点的复制关系后, ...
- 对宽度的控制原则 git commit -a -m "M 1、完成less计算得出图片的均分布局;";git push origin master:master
<script> import wepy from 'wepy' import api from '../api/api' export default class recharge ex ...
- Django分发控制器urls--白话聊Django系列
开始前,先上一张图,让理解Django内部的处理流程,从图中我们可以知道Django内部使用MTV架构,那今天讲的第一个部分就是控制器,在Tornado框架中叫做路由系统,负责把url映射到相应的处理 ...
- WIN文件放到LINUX中无法CAT过滤的解决方法
有个WIN文件放到LINUX服务器上处理的时候,由于编码的问题,导致无法过滤,此时需要对文件进行处理 cat file | tr -s "\r" "\n" &g ...
- RabbitMQ_消息队列基本使用_1
什么叫消息队列 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象. 消息队列(Message Queue)是一种应用间的通信方式,消 ...
- Maven学习笔记—仓库
Maven仓库 1 什么是Maven仓库 在Maven中,任何一个依赖.插件或者项目构建的输出,都可以成为构件,而Maven通常在某个位置统一的存储所有Maven项目共享的构件,这个统一的位置就是Ma ...
- RHEVM 相关介绍
基础概念: RHEV-H RHEVH(Redhat Enterprise Virtuallization Hypervisor),它是运行虚拟机所需的最低操作系统.RHEVH由作为RHEL(Redha ...
- Ajax知识
一.Ajax介绍前戏 1.json介绍 1.什么是json? json(JavaScript Object Notation,JS对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript ...
- php 计算器的例子
php实现的计算器的例子,代码如下: <html> <head> <title>PHP实现简单计算器-www.jbxue.com</t ...
- android 对话框中的进度条 (ProgressDialog)
from:http://byandby.iteye.com/blog/817214 显然要定义对话框进度条就要用ProgressDialog,首先我们需要创建ProgressDialog对象,当然这里 ...