zoukankan      html  css  js  c++  java
  • Functions that return a function

      javascript学习中,经常会遇到闭包的问题,然后闭包的很多例子中又会遇到很多返回函数的闭包的例子程序。因为对闭包的理解还不够透彻,然后对于Functions rerurn a function产生了疑问。

      stackflow上有一个关于functions return a function的问题,参考https://stackoverflow.com/questions/7629891/functions-that-return-a-function

      然后测试过程中发现一些问题,先看一下下面的例子;

    function a() {
          
            alert('A!');
        
            function b(){
                alert('B!'); 
            }
        
            return b();
        }
        
        var s = a();
        alert('break');
        s();

    这个程序的结果是

    A!
    B!
    break
    

     然后第二个程序是

    function a() {
      
        alert('A!');
    
        function b(){
            alert('B!'); 
        }
    
        return b;
    }
    
    var s = a();
    alert('break');
    s();

    执行结果如下

    A!
    break
    B!
    

     这两个例子其实存在问题,但是不影响我们来理解返回函数。最简单直接的解释如下:

    return b(); calls the function b(), and returns its result.

    return b; returns a reference to the function b, which you can store in a variable to call later.

    也就是说s = a():

    如果a函数中返回的是b(),就会调用b函数,并且将b函数的返回结果赋值给变量s;(这个例子中由于b函数没有返回值,所以s的值是undefined)

    如果a函数中返回的是b,会返回一个b函数的引用给变量s,你可以使用s()来调用该函数。


    然后说一下,运行上面代码的过程中遇到的问题,对于第一个例子,在运行过程中,会报出TypeError的错误,原因是变量s并不是一个函数。非函数变量后面是不可以添加“()”的,否则程序会报错。如果在不清楚变量是否是函数的情况下,可以使用typeof s == 'function'来测试一下。

     

  • 相关阅读:
    mysql 慢查询分析工具
    php+redis实现消息队列
    Mysql数据库千万级数据查询优化方案.....
    windows下安装docker详细步骤
    Git基础使用教程
    redis实现消息队列&发布/订阅模式使用
    macos上改变输入法顺序
    ssh动态转发小记
    ubuntu上runsv/runit小记
    使用libcurl下载https地址的文件
  • 原文地址:https://www.cnblogs.com/Jamie1032797633/p/9340186.html
Copyright © 2011-2022 走看看