//匿名立即调用函数
(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闭包的更多相关文章

  1. 关于js中闭包的理解

    1.以前很不理解js中闭包的概念及使用,下面来看一下 function foo() { var a = 123; var b = 456; return function () { return a; ...

  2. js的闭包

    一,关于js闭包的只是感觉很高大上似乎,对于学弱来说任何问题都是这样的,值得去钻研和提高. 资料上理解的都是关于js的闭包其实就是js的变量的作用域的灵活使用. 函数内部定义变量的时候,一定要用 va ...

  3. 彻底搞清js中闭包(Closure)的概念

    js中闭包这个概念对于初学js的同学来说, 会比较陌生, 有些难以理解, 理解起来非常模糊. 今天就和大家一起来探讨一下这个玩意. 相信大家在看完后, 心中的迷惑会迎然而解. 闭包概念: 闭包就是有权 ...

  4. 理解运用JS的闭包、高阶函数、柯里化

    JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性. 这里就整理一些,做个总结. 一.闭包 1. 闭包的概念 闭包与执行上下文.环境.作用域息息相关 执 ...

  5. c++11 闭包的实现

    c++11 闭包的实现 什么是闭包 闭包有很多种定义,一种说法是,闭包是带有上下文的函数.说白了,就是有状态的函数.更直接一些,不就是个类吗?换了个名字而已. 一个函数,带上了一个状态,就变成了闭包了 ...

  6. JS的闭包、高阶函数、柯里化

    本文原链接:https://cloud.tencent.com/developer/article/1326958 https://cloud.tencent.com/developer/articl ...

  7. 关于js的闭包和复制对象

    一.有关js的闭包 1.概念:所谓的闭包,就是指的两个作用域,其中内层作用于可以访问外层作用域的函数的现象 2.简单应用 for(var i = 0;i< lis.lenth;i++){ (fu ...

  8. JS的闭包问题

    1.什么是“闭包” 是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 2.闭包的应用场景 (1)保护变量的安全实现JS私有属性和私有方法 (2)在 ...

  9. 我从没理解js的闭包,直到他人向我这么解释。。。

    前段时间根据执行上下文写过一次闭包,但是写的简陋些.昨天在twitter上看到这篇文章,感觉背包的比喻挺恰当的.所以就翻译了. 这篇文章有些啰嗦,但是讲解很细,希望还是耐心看完.也欢迎指出错误. 原地 ...

  10. 深入理解JS的闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...

随机推荐

  1. Scala基础简述

    * Scala基础简述 本文章作为Scala快速学习的教程,前提环境是:我假设在此之前,你已经学会了Java编程语言,并且我们以随学随用为目标(在此不会深度挖掘探讨Scala更高级层次的知识).其中语 ...

  2. AngularJs轻松入门(四)模块化

    在前面几节教程中,代码比较少,为了方便说明问题笔者將控制器代码都写在了HTML页面中,实际上这并不是什么好的编程习惯,而且可维护性差.通常的做法都是將处理业务逻辑的代码写在一个单独的JS文件中,然后在 ...

  3. Java Web应用定制404错误页面

    Http响应状态码404的含义是服务器端没有找到客户端请求的资源,定制404错误页面至少有以下两个好处: 1.向客户端隐藏服务器信息,服务器提供的默认404错误页面上一般都包含当前应用使用的是什么服务 ...

  4. Saying Good-bye to Cambridge Again

    Saying Good-bye to Cambridge Again Very quietly I take my leave,      As quietly as I came here;     ...

  5. 安装meteor运行基本demo发生错误。

    bogon:~ paul$ curl https://install.meteor.com/ | sh % Total % Received % Xferd Average Speed Time Ti ...

  6. German Collegiate Programming Contest 2015(第三场)

    Divisions David is a young boy and he loves numbers. Recently he learned how to divide two numbers.D ...

  7. SSD-tensorflow-2 制作自己的数据集

    VOC2007数据集格式: VOC2007详细介绍在这里,提供给大家有兴趣作了解.而制作自己的数据集只需用到前三个文件夹,所以请事先建好这三个文件夹放入同一文件夹内,同时ImageSets文件夹内包含 ...

  8. global_step

    global_step=tf.Variable(0, trainable=False) 设定trainable=False 可以防止该变量被数据流图的 GraphKeys.TRAINABLE_VARI ...

  9. Host status showing red icon in chronograph, Chronograf主机列表页显示主机状态为红色标志

    刚开始全部装好的时候主机显示的状态是绿色的,过了些日子我再打开看的时候就变成红色的了,点击主机进去查看的时候没有了图表数据,大概是这样子的, 在influxdb数据库主机上执行命令curl " ...

  10. Spring Tool Suit安装virgo server插件、virgo的下载

    virgo-tomcat原先是Spring DM Server,后来转eclipse社区维护 安装教程:http://osgi.com.cn/article/7289514 virgo-tomcat各 ...