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特殊的变量作用域. 变量的作用域 ...
随机推荐
- nginx 代理https后,应用redirect https变成http --转
原文地址:http://blog.sina.com.cn/s/blog_56d8ea900101hlhv.html 情况说明nginx配置https,tomcat正常http接受nginx转发.ngi ...
- CUDA还未产出,又要出北洋多元统计习题集
其实目前是自己摸清了一个套路.genome realign的算法,以及CUDA的写法都已经有数了,前两天也弄完了关静的所有任务.但是今天关静早上一上来就宣布一个重磅消息:除了全学期的作业和期末论文,另 ...
- 机器学习(七) PCA与梯度上升法 (下)
五.高维数据映射为低维数据 换一个坐标轴.在新的坐标轴里面表示原来高维的数据. 低维 反向 映射为高维数据 PCA.py import numpy as np class PCA: def __ini ...
- decision tree 决策树(一)
一 决策树 原理:分类决策树模型是一种描述对实例进行分类的树形结构.决策树由结点(node)和有向边(directed edge)组成.结点有两种类型:内部结点(internal node)和叶结点( ...
- [笔记-统计学习方法]感知机模型(perceptron) 原理与实现
前几天认把感知机这一章读完了,顺带做了点笔记 现在把笔记做第三次的整理 (不得不说博客园的LaTex公式和markdown排版真的不太舒服,该考虑在服务器上建一个博客了) 零.总结 适用于具有线性可分 ...
- 同学们,OpenCV出3.0了,速去围观!
OpenCV3.0 OpenCV > NEWS > OpenCV 3.0 2015-06-04 With a great pleasure and great relief OpenCV ...
- 《Java设计模式》之装饰模式
装饰模式(Decorator) 1. 装饰模式(Decorator)的定义:又名包装(Wrapper)模式.装饰模式以对client透明的方式扩展对象的功能,是继承关系的一个替代方案. 2. ...
- 权重轮询调度算法 java版本号
权重轮询调度算法(Weighted Round-Robin Scheduling)--java版本号 因为每台server的配置.安装的业务应用等不同.其处理能力会不一样.所以,我们依据server的 ...
- CODE ---代码助手 (保存代码、搜代码、生成网页、自由界面)
四大功能 1 保存代码 2 搜索代码 3 生成网页 4 自由界面 www.gudianxiaoshuo.com
- vue3事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...