精华内容
下载资源
问答
  • PHP闭包函数用法
    2021-01-25 17:49:47

    一、闭包

    • 1).闭包和匿名函数在PHP5.3中被引入。

    • 2).闭包是指在创建时封装函数周围状态的函数,即使闭包所在的环境不存在了,闭包封装的状态依然存在,这一点和Javascript的闭包特性很相似。

    • 3).匿名函数就是没有名称的函数,匿名函数可以赋值给变量,还可以像其他任何PHP对象一样传递。可以将匿名函数和闭包视作相同的概念。

    • 4).需要注意的是闭包使用的语法和普通函数相同,但是他其实是伪装成函数的对象,是Closure类的实例。闭包和字符串或整数一样,是一等值类型。

    二、闭包使用

    1,匿名函数
    $变量名=functio(){  };		
    
    2,作为回调函数
    1)array_filter($数组,function( $v){
    
    					规则	
    					
    		});
    		根据规则筛选数组内容
    
    2)$numbersPlusOne = array_map(function($number) {
    
        return $number + 1;
        
    	}, [1, 2, 3]);
    	
    	根据函数内容,作用到数组每个值中,并且返回新数组
    

    三,附加状态

    1).注意PHP闭包不会真的像JS一样自动封装应用的状态,在PHP中必须调用闭包对象的bindTo方法或者使用use关键字,把状态附加到PHP闭包上。
    <?php
    function enclosePerson($name)
    {
        return function ($doCommand) use ($name) {
            return sprintf('%s , %s', $name, $doCommand);
       } 
    }
    //把字符串“Clay”封装在闭包中
    $clay = enclosePerson('Clay');
    //传入参数,调用闭包
    echo $clay('get me sweat tea!'); // Clay, get me sweat tea!
    

    在这个例子中,函数enclosePerson()有一个$name参数,这个函数返回一个闭包对象,这个闭包封装了 $name参数,即便返回的对象跳出了enclosePerson()函数的作用域,它也会记住$name参数的值,因为 $name变量仍然在闭包中。


    2).使用use关键字可以把多个关键字传入闭包,此时要想像PHP函数或方法的参数一样,使用逗号分割多个参数。

    3).PHP闭包仍然是对象,可以使用$this关键字获取闭包的内部状态。闭包的默认状态里面有一个__invoke()魔术方法和bindTo()方法。

    4).bindTo()方法为闭包增加了一些有趣的东西。

    我们可以使用这个方法把Closure对象内部状态绑定到其他对象上。bindTo()方法的第二个参数可以指定绑定闭包的那个对象所属的PHP类,这样我们就可以访问这个类的受保护和私有的成员变量。

    <?php
    class App
    {
        protected $route = array();
        protected $responseStatus = '200 OK';
        protected $responseContentType = 'text/html';
        protected $responseBody = 'Hello world';
    
        public function addRoute($routePath, $routeCallback)
        {
            $this->routes[$routePath] = $routeCallback->bindTo($this, __CLASS__);
        }
    
        public function dispatch($currentPath)
        {
            foreach($this->routes as $routePath => $callback) {
                if ($routePath === $currentPath) {
                     $callback();
                }
            }
            header('HTTP/1.1' . $this->responseStatus);
            header('Content-type: ' . $this->responseContentType);
            header('Content-length: ' . mb_strlen($this->responseBody));
            echo $this->responseBody;
        }
    }
    

    我们把路由回调绑定到了当前的App实例上,这样就可以在回调函数中处理App实例的状态了。

    <?php
    $app = new App();
    $app->addRoute('/users/xiaoxiao', function () {
        $this->responseContentType = 'application/json;charset=utf8';
        $this->responseBody = '{"name" : "xiaoxiao"}';
    });
    $app->dispatch('/users/xiaoxiao');
    
    更多相关内容
  • 闭包是指有权访问另一个函数作用域中的变量的函数,但作用域的配置机制有一个需要注意的地方,即闭包只能取得包含函数中任何变量的最后一个值。 如以下案例: function create(){  var arr = new Array();     ...
  • 主要介绍了PHP闭包函数传参及使用外部变量的方法,基于Laravel框架分析了PHP闭包函数传参及外部变量相关使用技巧,需要的朋友可以参考下
  • 在PHP中匿名函数(Anonymous functions),也叫闭包函数( closures ),允许临时创建一个没有指定名称的函数。经常用作回调函数(callback)的参数。 当然,也有其他应用的情况。 注:php闭包是PHP5.3版本之后才有...
  • 主要介绍了Python闭包函数定义与用法,结合实例形式分析了Python闭包函数的功能、定义、使用方法及相关操作注意事项,需要的朋友可以参考下
  • 定义函数表达式有两种方式:函数声明和函数表达式. 函数声明如下: function functionName(arg0,arg1,arg2){ //函数体 } 首先是function关键字,然后是函数的名字. FF,Safrai,Chrome和Opera都给函数定义了一个非标准...
  • JavaScript闭包函数

    2018-09-22 00:01:24
    闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...
  • python中的闭包函数

    2021-01-20 06:55:53
    闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print(hello world in foo) def bar(): print(hello world in bar) 此时...
  • PHP闭包函数详解

    2020-12-18 13:30:40
    匿名函数也叫闭包函数(closures允许创建一个没有指定没成的函数,最经常用作回调函数参数的值。 闭包函数没有函数名称,直接在function()传入变量即可 使用时将定义的变量当作函数来处理 $cl = function($name){ ...
  • python之闭包函数

    2021-04-08 11:30:21
    python 之闭包函数 闭包函数=名称空间与作用域 + 函数嵌套 + 函数对象 一、引入 大前提 闭包函数是对名称空间与作用域, 函数对象, 函数嵌套的综合运用 闭包函数 = 名称空间与作用域 + 函数嵌套 + 函数对象 ...

    python 之闭包函数

    闭包函数=名称空间与作用域 + 函数嵌套 + 函数对象

    一、引入

    大前提

    • 闭包函数是对名称空间与作用域, 函数对象, 函数嵌套的综合运用

    • 闭包函数 = 名称空间与作用域 + 函数嵌套 + 函数对象

    • 核心点:变量的查找关系是以函数定义阶段为准的

    二、什么是闭包函数?闭 & 包

    • 闭函数:指的是定义在函数内部的函数

    • 包函数:闭函数引用了一个来自于外层函数的变量

      • 特点:访问的变量不是自己的,而是外层函数的

    • 以上函数,合到一起为闭包函数,即:闭包函数=闭函数+包函数

    '总结一句话来说' : 定义在函数内部的函数, 并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数
        
    代码一:
    def f1():
        x = 10
        def f2():
            print(x)
    ​
    # 这个f2就是闭包函数。
    ​
    代码二:
    def outter():
         name='egon'
         def inner():
             print('my name is %s' %name)
         return inner  #注意不能加括号,加了括号就是返回的不是inner这个函数,而是inner函数调用完之后返回的是一个值,inner函数默认没有值,会返回一个None。
    ​
    f=outter()    #其实就是f=inner
    print(f) #<function outter.<locals>.inner at 0x0000014E06AE3F70>
    f() #my name is egon
    • 注意:作用域在函数定义阶段就规定死了,与调用的位置无关

      定义阶段已经规定死了到'outter'下面的"x"去拿
      def outter():
           x=2           
           def inner():
               # x=1
               print('from inner',x)
      ​
           return inner
      ​
      在全局里面定义也无效
       f=outter()  # f=inner
       print(f)
       x=11111111111111111
       f()  # 2
      ​
      把它装进一个函数,在函数里面再定义也是无效的
       def foo():
           x=111111111111111111
           f()
      ​
       foo()  # 2

       

    三、为函数传值的方式

    目前为止,我们得到了两种为函数体传值的方式,一种是直接将值以参数的形式传入,另外一种就是将值包给函数

    方式一: 将值以参数的形式传入

    代码一:
    def f2(x):
        print(x)
    ​
    f2(1)
    f2(2)
    f2(3)
    ​
    代码二:将以下"url"以参数的形式传入(也是最常用)
    import requests #导入requests模块
    ​
    def get(url):
        response=requests.get(url)下载
        if response.status_code == 200:
            print(response.text)
    ​
    get('https://www.baidu.com')
    get('https://www.python.org')
    ​
    # 提示提示:requests模块是用来模拟浏览器向网站发送请求并将页面内容下载到本地,需要事先安装:pip3 install requests
    

    方式二: 以包的形式传入(使用内嵌函数把函数包裹, 为被包裹的函数提供作用域名字的引用)

    代码一:
    def outter(x):
        def wrapper():
            print(x)    #按照查找的优先级去查找"x"
        return wrapper  #吐出了函数"wrapper"的内存地址
    ​
    f = outter(10)  #这里返回的值就是函数"wrapper"的内存地址,赋值给"f",加括号就调用
    f()  #10
    ​
    代码二:
    def f1(x):
        # x = 333
        def f2():
            print(x)
        return f2
    ​
    f = f1(333)  # 把原本属于f1局部的函数的名字, 拿到了全局.
    print(f)  # <function f1.<locals>.f2 at 0x000001DBF8C3CE50>
    ​
    f()  # 333, 实现了多次调用同一种传参的功能, 不需要重复传参.
    f()  # 333
    f()  # 333
    ​
    代码三:这是个获取网络源码的功能
    import requests    
    ​
    def outter(url):
        def get():
            response=requests.get(url)
            if response.status_code == 200:
                print(response.text)
        return get
        
    baidu = outter('https://www.baidu.com')
    baidu()
    

    对比两种方式,方式一在下载同一页面时需要重复传入url,而方式二只需要传一次值,就会得到一个包含指定url的闭包函数,以后调用该闭包函数无需再传url

    # 方式一下载同一页面
    get('https://www.python.org')
    get('https://www.python.org')
    get('https://www.python.org')
    ……
    ​
    # 方式二下载同一页面
    python=page('https://www.python.org')
    python()
    python()
    python()
    ……
    

    闭包函数的这种特性有时又称为惰性计算。使用将值包给函数的方式,在接下来的装饰器中也将大有用处

    四、闭包的作用:

    被引用的非全局变量也称作自由变量,这个自由变量会与内层函数产生一个绑定关系。 自由变量不会在内存中消失。

    1、保证数据安全。函数外无法访问自由变量。

    def func1():
        li = []
        def func2(x):
            li.append(x)
            return li
        ruturn func2
    f = func1()
    print(f(100))   # [100]
    print(f(100))   # [100, 100]
    print(f(100))   # [100, 100, 100]
    #li就是自由变量,并没有消失,但无法从函数外访问。
    

    2、为内部函数传参。

    返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。

    def f1(x):
        def f2():
            print(x,y)  # 优先使用外层的作用域,不会被全局所影响。
        x = 10
        y = 20
        return f2
    ​
    x = 1
    y = 2
    f1(x)()
    10 20
    

    五、如何判断一个嵌套函数是不是闭包:

    print(func.__code__.co_freevars)
    # 只要返回值有自由变量那么就是闭包
    ​
    def func():
        x = 10
        def f1():
            print(x)
        return f1
    ​
    print(func().__code__.co_freevars)
    ('x',)
    	
    展开全文
  • js中的闭包函数

    2020-12-06 13:05:54
    1-什么是闭包: 闭包是指有权访问另一个函数作用域中变量的函数。通俗来说就是 ,一个作用域可以访问另外一个函数...//fn就是一个闭包函数 21闭包的作用: 延伸变量的作用范围 function fn() { var num = 10; funct

    1-什么是闭包:
    闭包是指有权访问另一个函数作用域中变量的函数。通俗来说就是 ,一个作用域可以访问另外一个函数内部的局部变量。

    // An highlighted block
    function fn(){
    		var num=10;
    		function fn1(){
    			console.log(num);//10
    		}
    		fn1();
    }
    fn();
    //fn就是一个闭包函数
    

    21闭包的作用:
    延伸变量的作用范围

     function fn() {
       var num = 10;
       function fun() {
           console.log(num);
     	}
        return fun;
     }
    var f = fn();
    f();
    

    闭包练习案列

    <ul class="nav">
            <li>我好帅</li>
            <li>我真帅</li>
            <li>我超帅</li>
            <li>我特别帅</li>
        </ul>
    
    // 利用闭包函数打印当前li的索引号
    for (var i = 0; i < lis.length; i++) {
    // 利用for循环创建了4个立即执行函数
    // 立即执行函数也成为小闭包因为立即执行函数里面的任何一个函数都可以使用它的i这变量
    (function(i) {
        lis[i].onclick = function() {
          console.log(i);
        }
     })(i);
    }
    
    <ul class="nav">
            <li>我好帅</li>
            <li>我真帅</li>
            <li>我超帅</li>
            <li>我特别帅</li>
        </ul>
    
    // 五秒后打印出li的所有内容
    for (var i = 0; i < lis.length; i++) {
        (function(i) {
            setTimeout(function() {
            	console.log(lis[i].innerHTML);
            }, 5000)
        })(i);
    }
    

    闭包函数思考题:

    // An highlighted block
     var name = "The Window";
       var object = {
         name: "My Object",
         getNameFunc: function() {
         return function() {
         return this.name;
         };
       }
     };
    console.log(object.getNameFunc()())
    -----------------------------------------------------------------------------------
    var name = "The Window";  
      var object = {    
        name: "My Object",
        getNameFunc: function() {
        var that = this;
        return function() {
        return that.name;
        };
      }
    };
    console.log(object.getNameFunc()())
    
    展开全文
  • 什么是闭包函数

    万次阅读 多人点赞 2020-02-08 12:16:38
    什么是闭包函数 1、定义和用法:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包。(关于概念博主摘抄以上几点,详情查看 ...

    什么是闭包函数

    1、定义和用法:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包。(关于概念博主摘抄以上几点,详情查看   百度百科)
    2、表现形式:使函数外部能够调用函数内部定义的变量。

    案例1:根据作用域链的规则,底层作用域没有声明的变量,会向上一级找,找到就返回,没找到就一直找,直到window的变量,没有就返回undefined。这里明显变量a 是函数内部的fun 的那个变量a 。

    (变量的作用域分类:全局变量和局部变量。)
    *注:*函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
    在这里插入图片描述
    案例2:与案例一不同的是fun2闭包对象中,此时调用的函数nbfun2 只是内部函数的方法, 所以我们定义一个变量name调用闭包函数对象调用后,将nbfun2函数赋值给name变量;然后使用name()方式进行调用.
    在这里插入图片描述
    案例3:
    第一步:当我们调用闭包fun3对象时,一个传入1 一个传入2 将返回的函数对象分别给变量a b;
    第二步:此时从控制台输出内部函数调用 分别传入1 2 值给a1的y b2的y;
    (此时也就是说 a1 b2 都是闭包 他们共享相同的函数定义,但是保存在了不同的环境中)
    在a1中 x=1, b2中 x=2;

    在这里插入图片描述
    总结:

    使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念

    闭包有三个特性:

    1. 函数嵌套函数
    2. 函数内部可以引用外部的参数和变量
    3. 参数和变量不会被垃圾回收机制回收
    展开全文
  • js中使用闭包函数

    2021-01-11 21:17:58
    闭包函数,就是嵌套结构的函数,在一个函数内定义的一个函数。作为闭包的必要条件,内部函数应该访问外部函数中声明的私有变量,参数,或者其他内部函数。当上述两个必要条件实现后,此时如果在外部函数外调用这个...
  • 闭包函数,又称为闭合函数,简称为闭包。 与嵌套函数类似,不同之处在于,闭包函数要求外部函数返回的是一个函数。
  • 理解闭包的概念 以及常见的闭包函数的写法 闭包的定义 在程序员的红宝书中,给闭包定义为闭包是指有权访问另一个函数作用域中的变量的函数.相当于父级作用域能够访问子级作用域 闭包的作用 可以在函数的外部访问到...
  • 主要介绍了javascript中的return和闭包函数浅析,至少可以让你搞懂那么多()是什么意思,需要的朋友可以参考下
  • Python闭包函数

    千次阅读 2019-01-15 09:17:50
    1.创建一个闭包函数: (1)闭包函数必须有内嵌函数 (2)内嵌函数必须要引用外层函数的变量 (3)闭包函数返回内嵌函数的地址(函数名称) 2.判断闭包函数的方法:__closure__内置属性 (1)闭包函数没有参数...
  • 本文实例讲述了thinkPHP5框架闭包函数用法。分享给大家供大家参考,具体如下: 普通使用 举个栗子: $this->where(function ($query) { $query->where('id', 1)->whereor('id', 2); })->find(); 上述栗子就是一个...
  • PHP的闭包函数

    2020-04-24 06:16:32
    闭包函数(Closures)又叫做匿名函数(Anonymous functions),也就是没有定义名字的函数。主要用作回调函数的参数值。闭包在 PHP5.3 中被引入。闭包使用的语法和普通函数相同,但是他其实是伪装成函数的对象,是 ...
  • Python基础之闭包函数

    万次阅读 多人点赞 2019-03-11 23:21:43
    文章目录闭包的概念闭包实例如何判断是否是闭包函数 闭包的概念 在 Python 中很多地方都会使用到闭包,那么究竟什么叫做闭包呢? 在维基百科上是这么解释的。 在一些语言中,在函数中可以(嵌套)定义另一个...
  • 在JavaScript中,闭包恐怕是很多人不能理解的一个概念了,甚至很多人也会把闭包和匿名函数混淆。  闭包是有权访问另一个函数作用域中的变量的函数。首先要明白的就是,闭包函数。由于要求它可以访问另一个函数的...
  • 闭包函数做显隐内容,主要优势就是可以增加显示与隐藏效率。
  • 闭包函数

    2020-08-12 20:52:30
    什么叫闭包函数:定义在函数内部的函数,被 return 出去,在函数外部调用的话。会形成闭包。 闭包函数的特点:如果在闭包函数中使用了某个局部变量,这个局部变量的空间会被系统保存至闭包结束。 闭包的用途:可以...
  • 主要帮助大家轻松学习掌握Javascript闭包函数,从闭包的含义出发,由浅入深学习Javascript闭包函数,感兴趣的小伙伴们可以参考一下
  • PHP实现闭包函数时主要依靠匿名函数,在闭包函数中使用外界变量时使需用USE关键字,USE引用过来的变量是一个副本,若在闭包函数中修改变量的值只需在变量前添加取址符&即可。具体demo如下: 1.匿名函数实现闭包...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 174,274
精华内容 69,709
关键字:

闭包函数

友情链接: 千千静听.rar