zoukankan      html  css  js  c++  java
  • 【Dart学习】-- Dart之函数声明&&匿名函数&&自执行方法

    1.1函数的声明

    如下方法 add就是函数声明的代码结构:

    void add(x,y){
      print("$x -- $y");
    }
    
    void main(){
       add(2,3);
    }
    • 关于函数声明,它最重要的一个特征就是函数声明提升,意思是执行代码之前先读取函数声明。这意味着可以把函数声明放在调用它的语句之后。如下代码可以正确执行:
      void main(){
         add(2,3);
      }
      
      void add(x,y){
        print("$x -- $y");
      }

    1.2函数表达式

    函数表达式中有几种不同的语法。最常见和最具代表性的一种如下所示:

    void main(){
       var adds = (x,y){
             print("$x -- $y");
            };
       adds(3,5);
    }
    • 这种形式看起来好像是常规的变量赋值语句。但是函数表达式和函数声明的区别在于,函数表达式在使用前必须先赋值。所以这段代码执行的时候就会出错
      void main(){
         adds(3,5);
         var adds = (x,y){
               print("$x -- $y");
         };
      }
    • 造成这种现象是因为解析器在向执行环境中加载数据时,解析器会率先读取函数声明,并使其在执行任何代码前可用;至于函数表达式,则必须等到解析器执行到它的所在的的代码行,才会真正的被解析。函数表达式中,创建的函数叫做匿名函数。

    2.匿名函数的调用方式

      匿名函数,顾名思义就是没有名字的函数。

    •   第一种调用方式:
        上面的函数表达式中的创建,实际上是创建一个匿名函数,并将匿名函数赋值给变量 add,用 add来进行函数的调用,调用的方式就是在变量 add后面加上一对括号(),如果有参数传入的话就是 add(1,2),这就是匿名函数的一种调用方式。
      void main(){
         var adds = (x,y){
               print("$x -- $y");
              };
         adds(3,5);
      }
    • 第二种调用方式:
      另外一种匿名函数的调用方式是:使用()将匿名函数括起来,然后后面再加一对小括号(包含参数列表)。

      void main(){
         ((x,y){
           print("$x -- $y");
         }(3,5));
      }

      或者(参数小括号写包括匿名函数的在外边)

      void main(){
         ((x,y){
           print("$x -- $y");
         })(3,5);
      }

      以上代码的这种方式就是模仿了块级作用域(通常成为私有作用域),语法如下所示:

      (function(){  
          //这里是块级作用域  
      })(参数);

      以上代码定义并立即调用了一个匿名函数。经函数声明包含在一对圆括号中,表示它实际上是一个函数表达式。而紧随其后的另一对圆括号会立即调用这个函数。

       从上面对于函数和匿名函数的了解,我们引申出来了一个概念,即自执行函数。

    3.自执行匿名函数

    自执行函数,即定义和调用合为一体。我们创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,因此在执行完后很快就会被释放,关键是这种机制不会污染全局对象。

    • 下面我们来看下一些比较有趣的自执行函数表达方式:
      // 下面2个括弧()都会立即执行  
      (function () { /* code */ } ()) // 推荐使用这个  
      (function () { /* code */ })() // 但是这个也是可以用的  
  • 相关阅读:
    mysql 重置root 账户密码
    Applicationpoolidentity 好有趣哦
    类模板的困扰 LNK2019 (转)
    C++中定义比较函数的三种方法
    Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)
    MyBatis与Hibernate总结篇
    Java中的回调
    闲来重写一下快速排序
    【lucene】一个简单的招聘网站的建立
    【Lucene】小谈lucene的BooleanQuery查询对象
  • 原文地址:https://www.cnblogs.com/lxlx1798/p/11045149.html
Copyright © 2011-2022 走看看