文档章节

javascript-闭包

啃不动地大坚果
 啃不动地大坚果
发布于 2017/04/08 12:06
字数 427
阅读 10
收藏 0

闭包通俗讲就是函数中套函数
function aa(){
    ...
    return function(){
    ...
    }
}

看下面的例子就能理解7,8分了

	var number =2 ;
	var obj = {
		number : 4,
		fn1 : (function(){
			this.number *= 2;
			number = number*2;
			var number = 3;
			return function(){
				this.number *= 2;
				number *= 3;
				alert(number);
			}
		})()
	};

	var fn1 = obj.fn1;
	alert(number);//4
	fn1();//9
	obj.fn1();//27

	alert(window.number);//8
	alert(obj.number);//8

执行过程
【window.number=undefined;obj.number=undefined;obj.number=undefined;fn1.number=undefined;】

1.var number =2 ;
【window.number=2;obj.number=undefined;obj.number=undefined;fn1.number=undefined;】

2.var obj = {}
2-1.number : 4
【window.number=2;obj.number=4;obj.number=undefined;fn1.number=undefined;】
2-2.fn1(function(){})()使用函数表达式声明 会在obj对象定义时被立即执行,
fn1执行过程为
1)this.number *= 2;
this.number[匿名函数的直接运行由window调用 fn1此时由window调用 this即window]
this.number *= 2;相当于window.number *= 2;
【window.number=4;obj.number=4;obj.number=undefined;fn1.number=undefined;】

2)number = number*2; var number = 3;
 var number = 3;虽然定义在后面,但是var定义会被预解释,此时已经分配内存空间了但值为undefined
所以可以理解为这样
 var number;number = number*2; number = 3;
【window.number=4;obj.number=4;obj.number=undefined;fn1.number=3;】

3)return 
function(){ this.number *= 2; number *= 3;alert(number); }不会执行,只是返回了函数定义。

3.var fn1 = obj.fn1; 只是获取了对obj.fn1的引用

4.alert(number);//4
这里的number是window.number;

5.fn1();//9
这里执行的是function(){ this.number *= 2; number *= 3;alert(number); }
调用元不指定的话 就是window 即window.fn1();
function(){ this.number *= 2; number *= 3;alert(number); }开始执行
this.number *= 2;  调用元是window所以相当于window.number *= 2;
number *= 3;这是会查找作用域链 number是fn1.number   即3*3=9
【window.number=8;obj.number=4;obj.number=undefined;fn1.number=9;】

6.obj.fn1();
这时调用元换成了obj
调用的还是function(){ this.number *= 2; number *= 3;alert(number); }
 this.number *= 2; 这是相当于obj.number *= 2;
【window.number=8;obj.number=8;obj.number=undefined;fn1.number=27;】

 

© 著作权归作者所有

共有 人打赏支持
啃不动地大坚果
粉丝 6
博文 119
码字总数 153788
作品 0
其它
程序员
私信 提问
JavaScript 需要掌握的知识

1.不仅仅是面试,JavaScript 开发者都应该知道的十个概念(https://my.oschina.net/editorial-story/blog/1529543) 2. 深入理解javascript原型和闭包(完结)(http://www.cnblogs.com/wangfup...

IT追寻者
2016/06/25
0
0
javascript深入理解js闭包

一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量...

Yamazaki
2012/06/15
0
0
javascript中闭包是什么

javascript中闭包是什么 JavaScript 变量可以是局部变量或全局变量。私有变量可以用到闭包。闭包就是将函数内部和函数外部连接起来的一座桥梁。 函数的闭包使用场景:比如我们想要一个函数来...

前端攻城小牛
2018/10/29
0
0
深入理解JavaScript闭包

一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量...

柯楠
2012/11/02
0
0
JavaScript开发者应懂的33个概念

简介 这个项目是为了帮助开发者掌握 JavaScript 概念而创立的。它不是必备,但在未来学习(JavaScript)中,可以作为一篇指南。 本篇文章是参照 @leonardomso 创立,英文版项目地址在这里。 ...

大灰狼的小绵羊哥哥
2018/10/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

AWS自动部署工具codedeploy的部署概述

1)在AWS lambda平台上部署: 三大部分:要部署的内容 --> 部署的配置 --> 更新的lambda函数版本 部署的流程:上传修订的应用程序-->创建一个应用程序-->指定部署组-->指定部署的配置-->指定...

守护-创造
14分钟前
0
0
好程序员教程分享Javascript设计模式

好程序员教程分享Javascript设计模式 方法一 对象字面量表示法   在对象字面量表示法中,一个对象被描述为一组包含在大括号中,以逗号分隔的 name/value 对。对象内的名称可以是字符串或标...

好程序员IT
20分钟前
1
0
fail-fast和fail-safe的介绍和区别

fail-fast和fail-safe 前言 前段时间公司招的实习生在使用迭代器遍历的时候,对集合内容进行了修改,从而抛出ConcurrentModificationException. 然后给他讲解之余也整理了这一篇文章. fail-fa...

群星纪元
22分钟前
2
0
控制反转 IOC

控制反转(Inversion of Control,缩写为IoC)面向对象设计原则,降低代码耦合度 依赖注入(Dependency Injection,简称DI) 依赖查找(Dependency Lookup):容器提供回调接口和上下文条件给...

SibylY
33分钟前
1
0
网络介绍:Kubernetes设计文档

模型和动机 Kubernetes从Docker默认的网络模型中独立出来形成一套自己的网络模型。该网络模型的目标是:每一个pod都拥有一个扁平化共享网络命名空间的IP,通过该IP,pod就能够跨网络与其它物...

xiangyunyan
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部