闭包和匿名函数

在高级程序设计里,描述闭包是指有权访问另一个函数作用域中的变量的函数。

而经常创建方式是一个函数里包含另一函数。

而匿名函数就如“匿名”这两个意思一样。

所以匿名函数和闭包不是同一个概念。

在高级程序设计里描述匿名函数的执行环境具有全局性,所以this指向为window。这就是

为什么有时候发现this指向,不是自己所想的对象的问题。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
        var name="a";
        var obj={
            name:"b",
            showFn:function(){
                return (function(){
                    return this.name;
                })();
            }
        }
        console.log(obj.showFn());
    </script>
</body>
</html>

打印结果为“a”

测试中可知:this指向window,所以才打印出“a”;

闭包:

简单的例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>     name="cde";
        function a(){
            var name="abc";
            function b(){
                alert(name);
            };
            b();
        }
        a();
    </script>
</body>
</html>

然而使用画图更好理解:

而这里的0表示自己的执行环境,1是上级执行环境,2是上上级执行环境,以此类推。

而变量查找是就近原则的,在自己最近的作用域查找到就会停止查找。

而这里活动对象的理解,很重要,因为只有函数在被调用时才是变量对象才是活动的,

才会去查找所要的变量。

如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
        function a(){
            var name="abc";
            var arr=[];
            for(var i=0;i<4;i++){
                arr[i]=function b(){
                    alert(i);
                };
            }
            return arr;

        }
        a()[0]();
        a()[1]();
        a()[2]();
    </script>
</body>
</html>

弹出的结果都是4;

这是因为函数执行时内部函数没有在执行,而是内部函数执行完之后被调用时才执行,所以

这时活动对象上级作用域的变量都是同一一个值了;

还有闭包的执行环境结束了,活动对象也不会被销毁,这就像全局作用域,所以闭包里的变量是不会被

回收的,会一直保存着。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
        function a(){
            var num=0;
            return function b(){
                num++;
                console.log(num);
            }
        }
        var m1=a();
        m1();
        m1();
        m1();
    </script>
</body>
</html>结果:1,,2,3

虽然使用闭包要谨慎;

但使用闭包可以避免全局污染的问题。

时间: 2024-12-11 10:43:14

闭包和匿名函数的相关文章

php闭包与匿名函数

不知不觉发现PHP已经出到了5.5版本,而自己一直在用PHP5.2,让我看起来像深山出来的小伙子一样,又土又落后.在我习惯在javascript中使用闭包之后,忽然间对PHP的闭包打起了兴趣. 于是乎在网上下了个WAMP集成开发环境,是PHP5.3版本的(PHP5.3开始引入了闭包的特性),不得不说WAMP安装使用真的很方便.简单配置了一下,开始动手. 匿名函数 提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它.声明一个匿名函数是这样: 1 $fun

PHP中的闭包和匿名函数

PHP中的闭包和匿名函数 闭包是指在创建时封装周围状态的函数.即使闭包所在的环境不存在了,闭包中封装的状态依然存在. 匿名函数就是没有名称的函数.匿名函数可以赋值给变量,还能像其他任何PHP对象那样传递.不过匿名函数仍是函数,因此可以调用,还可以传入参数.匿名函数特别适合作为函数或方法的回调. 注意:理论上讲,闭包和匿名函数是不同的概念.不过,PHP将其视作相同的概念.所以,我们提到闭包时,指的也是匿名函数,反之亦然. PHP闭包和匿名函数使用的句法与普通函数相同,但闭包和匿名函数其实是伪装成函

浅析PHP中的闭包和匿名函数

PHP闭包和匿名函数使用的句法与普通函数相同,但闭包和匿名函数其实是伪装成函数的对象(Closure类的实例) .下面给大家介绍PHP中的闭包和匿名函数知识,需要的朋友参考下吧 闭包是指在创建时封装周围状态的函数.即使闭包所在的环境不存在了,闭包中封装的状态依然存在. 匿名函数就是没有名称的函数.匿名函数可以赋值给变量,还能像其他任何PHP对象那样传递.不过匿名函数仍是函数,因此可以调用,还可以传入参数.匿名函数特别适合作为函数或方法的回调. 注意:理论上讲,闭包和匿名函数是不同的概念.不过,P

js闭包,匿名函数概念

var functionName = function(arg){ //函数体 }; 匿名函数:创建一个函数,并将它赋值给一个变量,这种情况下创建的函数叫做匿名函数,因为function关键字后面没有标识符.(匿名函数有时候也叫拉姆达函数).匿名函数的name属性是空字符串. 注:FireFox.Safari.Chrome和Opera都给函数定义了一个非标准的name属性,通过这个属性可以访问给函数指定的名字.这个属性的值永远等于跟在function关键字后面的标识符. 闭包是指有权访问另一个函

【JS进阶3】闭包和匿名函数

想要学习闭包先来看看什么是匿名函数吧!   (一)匿名函数        匿名函数就是没有名字的函数.他有两种声明方式:        1.典型的函数声明:        function functionName(arg0,arg1,arg2){            //函数体        }        2.函数表达式:        var functionName = function(arg0,arg1,arg2){            //函数体        }   虽然这

Python 学习笔记 -- 内嵌函数、闭包、匿名函数、高阶函数map、高阶函数filter、高阶函数reduce

1 #------------------------------内嵌函数------------------------------ 2 #内嵌函数就是在函数内部定义函数 3 #实例一 4 print("#------------------------------内嵌函数------------------------------") 5 def funOutOne(): 6 x = 5 7 def funIn(): 8 x = 3 9 print("My funOutO

高阶函数、返回函数、闭包、匿名函数、装饰器、偏函数

整理多个网友知识: 一.高阶函数(函数作为变量,传给另外一个函数使用) 高阶函数例子: 备注:math模块sqrt()函数求平方根. #!/usr/bin/env python #-*- coding:utf-8 -*- import math def add(x, y, f):     return f(x) + f(y) print add(100, 16, math.sqrt) [[email protected] ~]# python test1.py  14.0 内置高阶函数: (1)

JavaScript中的闭包与匿名函数

知识内容: 1.预备知识 - 函数表达式 2.匿名函数 3.闭包 一.函数表达式 1.定义函数的两种方式 函数声明: 1 function func(arg0, arg1, arg2){ 2 // 函数体 3 } 函数表达式: 1 var func = function (arg0, arg1, arg2){ 2 // 函数体 3 } 2.注意事项 函数表达式使用前必须赋值!像下面的代码是错误的: 1 say() 2 var say = function(){ 3 console.log("12

关于js的闭包和匿名函数

关于js闭包.之前我一直以为是匿名函数,以为封闭式的创建即执行销毁就是闭包,其实这是匿名函数,不一样的.也没有闭包的使用经验. 后来去网上查了下才知道,闭包的意思是:函数内部还有函数,返回一个函数,内部函数可访问外部函数的变量. 一个最简单的案例: a是外部函数,b是内部函数,b可以使用a的变量i,调用a函数返回b函数,执行c既是执行b.其实也就意味着在a函数的外部,读取到了a函数内部的变量值. a中的变量i将一直在内存中,直至c变量删除. 删除变量:delete c; { let a=func