js---11闭包
//匿名立即调用函数
(function(){//把a,b,f全部隐藏在函数中,外部访问不到,
var a = 5;
var b = 6;
function f(){
alert(a);
}
window.f = f;//为了让外部能够访问,把变量a,b隐藏了防止了变量名冲突。保证内成函数使用的变量仅仅是外层函数包括的变量,防止了变量重名。
})();
f();
//自己的scope属性 == 父级的环境,
//自己的scope属性 == 自己的环境
//闭包:
//函数的嵌套相当于类的继承,函数相当于类,外部函数的变量也是内部函数的,内部函数可以使用,并且变量可以重写(类似于方法的重写)
//作用域链、闭包:函数的嵌套,不是外部类与内部类的关系,是父类与子类的关系,函数是类,内部函数是子类。
//在js层面,只有函数嵌套才会产生闭包。(闭包和全局window对象在浏览器里面都可以查看)。
//闭包的本质是因为js支持作用域链和函数的嵌套。要有函数嵌套才会产生闭包。(词法作用域==静态作用域==闭包)
function f1(){
var a = 10;
var b = 20;
function f2(){//运行在这里的时候就创建了f2的闭包,并且把a,b放在f2的闭包中,所以f2中可以访问a,b.
console.log(a);//可以访问a,b
}
f2();
}
f1(); function f1(){
var a = 10;
var b = 20;
return function f2(){
console.log(a);
}
}
var r = f1();
r();//可以访问a,b,由于f2函数(子类)可以访问外部函数(父类)的变量,所以f2函数(子类)运行的时候就会少传递参数(因为可以直接使用父类的成员,包括父级函数的形参)。 function f1(){
var m = 10;
function f2(){
console.log('a');//f2函数没有用到外部函数的变量,不会产生闭包。
}
f2();
}
f1(); function f1(){
var m = 10;
function f2(){
var n = 20;
function f3(){
console.log(m);//f3不用父级的成员,用父级的父级的成员,会产生闭包
}
}
f2();
}
f1(); ----------------------------------------------------------
不用全局变量,使得调用一个函数多次可以使得一个变量累加。
function add(){
var a= 0;
return function(){
a++;
ALERT(a)
};
}
var f = add();
f();f();f(); //使用闭包注意点:
//捕获的父级的变量只是一个引用,不是复制
function f(){//父类
var num = 1;
function g(){//子类
alert(num);
}
num++;
g();//子类对象执行
}
f();// //
分析闭包的时候,把函数通过小括号f()执行,不当成c++的函数通过地址调用,当成java的匿名对象执行,分析闭包作用域。
父函数每执行一次产生不同的闭包,函数通过地址调用多次,会产生多个独立的作用域,类似于java多个对象产生
function f(){
var num = 1;
return function(){//把子类对象return出去,每return一次都是一个新的对象
num++;
alert(num);
}
}
var r1 = f();
r1();//
r1();// var r2 = f();//2个对象
r2();//
r2();// <div id='1'></div>
<div id='2'></div>
<div id='3'></div>
for(var i = 1;i<3;i++){//js没有块作用域,等价于var i ;声明在for的外面,i是一个全局变量,
var d = document.getElementById(i); //这里的i已经使用了,所以i对应是0,1,2
d.onclick = function(){
alert(i);//每次都是4,可以通过this,这里i没有使用,一直是i,最后使用的时候i是4了,
}
}
//改写,通过闭包(函数嵌套来解决)
for(var i = 1;i<3;i++){
var d = document.getElementById(i);
d.onclick = (function(id){ //匿名函数并且立即执行,这里i使用了所以是0,1,2,
return function(){ //onclick = 3个不同的子类函数对象,3个子类对象的id值不一样
alert(id);
}
})(i); //i作为参数传递给id
}
</script>
d.onclick函数每执行一次就会产生一个独立的闭包,互不影响,闭包类似于一个对象,互不影响。
分析闭包的时候,把函数通过小括号f()执行,不当成c++的函数通过地址调用,当成java的匿名对象产生了,子函数就是子对象,分析闭包作用域。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script type=text/javascript charset=utf-8>
var name = "xiao A";
var obj = {
name : "xiao B" ,
getName: function(){
return function(){
return this.name;
}
}
};
var k = obj.getName(); //函数结构体return function(){returnthis.name;},这个函数返回后就是全局window的了。
alert(typeof k); // function类型
alert(k());//xiao A
alert(obj.getName()()); //xiao A ,obj.getName()执行后函数就是window的了, var name = "xiao A";
var obj = {
name : "xiao B" ,
getName: function(){
// this总是指向调用者
var o = this;//this是调用getName的对象
return function(){
return o.name;//o是this,子对象的o永远是父对象的
}
}
};
alert(obj.getName()());
var k = obj.getName();//xiao B
alert(k()); // 闭包:一个函数 可以访问另外一个函数作用域中的变量
// 封闭性 : private 起到一个保护变量的作用
// 1
function f(x){ // 2
var temp = x ; //局部变量 //temp已经没有被使用
return function(x){ // 3 (function 有了一个执行域 var obj)
temp += x ; // 又被使用了
alert(temp);
}
}
var a = f(50); //父类只有一个
alert(a); a(5); //子对象1,55
a(10);//子对象2,65
a(20); //子对象3,85
</script>
</head>
<body>
</body>
</html>
js---11闭包的更多相关文章
- 关于js中闭包的理解
1.以前很不理解js中闭包的概念及使用,下面来看一下 function foo() { var a = 123; var b = 456; return function () { return a; ...
- js的闭包
一,关于js闭包的只是感觉很高大上似乎,对于学弱来说任何问题都是这样的,值得去钻研和提高. 资料上理解的都是关于js的闭包其实就是js的变量的作用域的灵活使用. 函数内部定义变量的时候,一定要用 va ...
- 彻底搞清js中闭包(Closure)的概念
js中闭包这个概念对于初学js的同学来说, 会比较陌生, 有些难以理解, 理解起来非常模糊. 今天就和大家一起来探讨一下这个玩意. 相信大家在看完后, 心中的迷惑会迎然而解. 闭包概念: 闭包就是有权 ...
- 理解运用JS的闭包、高阶函数、柯里化
JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性. 这里就整理一些,做个总结. 一.闭包 1. 闭包的概念 闭包与执行上下文.环境.作用域息息相关 执 ...
- c++11 闭包的实现
c++11 闭包的实现 什么是闭包 闭包有很多种定义,一种说法是,闭包是带有上下文的函数.说白了,就是有状态的函数.更直接一些,不就是个类吗?换了个名字而已. 一个函数,带上了一个状态,就变成了闭包了 ...
- JS的闭包、高阶函数、柯里化
本文原链接:https://cloud.tencent.com/developer/article/1326958 https://cloud.tencent.com/developer/articl ...
- 关于js的闭包和复制对象
一.有关js的闭包 1.概念:所谓的闭包,就是指的两个作用域,其中内层作用于可以访问外层作用域的函数的现象 2.简单应用 for(var i = 0;i< lis.lenth;i++){ (fu ...
- JS的闭包问题
1.什么是“闭包” 是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 2.闭包的应用场景 (1)保护变量的安全实现JS私有属性和私有方法 (2)在 ...
- 我从没理解js的闭包,直到他人向我这么解释。。。
前段时间根据执行上下文写过一次闭包,但是写的简陋些.昨天在twitter上看到这篇文章,感觉背包的比喻挺恰当的.所以就翻译了. 这篇文章有些啰嗦,但是讲解很细,希望还是耐心看完.也欢迎指出错误. 原地 ...
- 深入理解JS的闭包
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...
随机推荐
- 如何让alertdialog选择完后自动关闭
builder.setIcon(R.drawable.ic_system) .setTitle("串口号") .setSingleChoiceItems(mPorts, mSele ...
- Java类和对象11
首先,编写一个类ChongZai,该类中有3个重载的方法void print():其次,再编写一个主类来测试ChongZai类的功能. public class ChongZai { public v ...
- SVN: repository browser 库浏览器
SVN: repository browser 库浏览器 -----如果不想全部下载,可以通过repository browser 库浏览器 从库中选择要下载的文件夹内容下载(svn针对性下载)
- Bayes++ Library入门学习之熟悉class-Bayesian_filter_base(1)
在对Bayes++库的名称空间有了一个大概的了解之后,我们开始学习该名称空间下的第一个子类Bayesian_filter::Bayes_filter_base. 该类与其子类的继承关系图如下图所示. ...
- JZOJ5821手机信号
用set维护,(l,r,v),注意边界,保证了两个端点l,r一定有信号站 增加有三种可能,1.直接加(没有影响),2.将原本的一个区间变成两个 3.将原本的一个区间变成三个 删除有三种情况,1.全包含 ...
- Python中的引用计数法
目录 引用计数法 增量操作 计数器溢出的问题 减量操作 终结器 插入计数处理 引用计数法 增量操作 如果对象的引用数量增加,就在该对象的计数器上进行增量操作.在实际中它是由宏Py_INCREF() 执 ...
- 网络编程select函数
select函数的作用: 在编程的过程中,经常会遇到许多阻塞的函数,好像read和网络编程时使用的recv, recvfrom函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法 ...
- 习题(3-3) 计算(a+b)*c的值
题目 - 习题(3-3) 计算(a+b)*c的值 来源 计算概论B 2010 描写叙述 计算表达式(a+b)*c的值,当中a, b, c均为整数,且a,b,c的值介于-10000和10000之间( ...
- BZOJ3511: 土地划分
[传送门:BZOJ3511] 简要题意: 给出n个点,m条边,每个点有A和B两种形态,一开始1为A,n为B 给出VA[i]和VB[i],表示第i个点选择A和B形态的价值 每条边给出x,y,EA,EB, ...
- 关于commJS 和 es6 的一些区别
CommonJS模块与ES6模块的区别 本文转自 https://www.cnblogs.com/unclekeith/archive/2017/10/17/7679503.html CommonJS ...