zoukankan      html  css  js  c++  java
  • JS入门(四)

      接之前一篇的函数。写之前的函数的时候讲的比较笼统,在这重新写一下函数的内容。

    函数:

      之前提过,函数就是代码复用的一种机制或是将代码封装成功能的代码段。函数的声明在这边就不多提了,因为相对来说比较简单。除了正常的函数声明之外,还有一种函数的声明方式,就是函数表达式。它的格式如下:

    var fun=function(){
        console.log("啦啦啦");
    }
    fun();

      先是用var关键字来定义一个变量,在等号的右边写一个匿名函数,匿名函数,顾名思义也就是没有名字的函数,匿名函数在调用的时候,是用变量名来加一个小括号的形式调用它。值得注意的是,在用函数表达式声明函数的时候记得要再花括号后加一个分号,不然程序有可能出现一些不可预知的错误。比如后面如果跟了个自执行函数的话,就有可能报错或者出现一些跟我们想的不一样的结果。

      这里提到了个自执行函数,那么什么是自执行函数呢?自执行函数是没有名字的,定义了之后马上调用的函数。这种函数多用于一次性使用的时候。它得格式如下:

    (function () {
        console.log("啦啦啦");
    })();
    
    //------------------------------分割线---------------------------
    (function () {
        console.log("哈哈哈");
    }());

      第一眼看感觉有点复杂,那要怎么理解记忆呢?我们都知道,函数的调用是用函数名+括号的形式来调用的。那么单独使用函数名会输出什么结果呢?比如下面这段代码:

    function fun(){
        console.log("啦啦啦");
    }
    console.log(fun);

    在控制台打印的结果为:

     

      由此我们可以知道,使用函数表达式定义函数之后,变量跟函数体是等价的。因此,自执行函数就很好记了,就是把以前写函数名的地方改成了函数体的形式,并且在外面加了一层括号来指定自执行函数的区域。自执行函数的好处就是不需要定义变量名,而且定义了之后马上调用。

      除此之外,函数还有很多其他的作用,比如函数还可以作为一个参数传入另一个函数之中。根据前面自执行函数演示的代码可以知道,当单独打印函数名的时候,会打印出整个函数体。函数是一种数据类型,如果用typeof来打印一下函数名的时候,会打印出一个function的值。

      比如下面这段代码,他在控制台输出的结果就是function。由此我们可以知道,函数是有数据类型的,并且它的类型是function。

    function fun(){
        console.log("啦啦啦");
    }
    console.log(typeof fun);

      因此,函数可以作为一个参数来传入另一个函数之中。那具体是怎么使用的呢?可以看下面的代码。

    function getResult(a, b, fn) {
        return fn(a, b);
    }

      我们在getResult这个函数中定义了三个参数,a,b,fn。这三个参数都只是形参,因此可以是任意值。首先我们先分析一下这段代码,这段代码定义了一个函数名为getResult的函数。这个函数有三个参数a,b,fn。它的返回值是一个函数名为fn,参数为a,b的函数。

      在这里,我们把fn看成了一个函数来使用,并且把getResult函数中的形参a和b来当做fn函数中的实参。这样,我们就实现了把函数当做变量传入另一个函数中。在函数调用的时候,我们就可以用这种形式来表示:

    var f1 = function(a,b){
        return a*b;
    };
    
    console.log(getResult(15, 60, f1));

      在这里,我们先用函数表达式的方法定义了一个名叫fn的函数,并且把他当成参数传进了getResult函数中。函数执行的结果为900;这样,我们就已经完成了把函数作为一个参数传入另一个函数中。不过,这段代码还简化一下。

      因为在定义了函数之后,函数名跟函数体是等价的,所以,上面代码还可以简写成这样。

    Console.log(getResult(15,60,function(a,b){
        return a*b;
    }));

      说完了这些,然后在说说JS中一些跟其他语言不同的地方,比如函数的重载,在JS中是没有函数重载的。既然说JS没有重载的话,就不得不提一下什么是重载了。所谓的重载就是函数名相同,但是函数的形参个数不同,或者形参的数据类型不同,这样就构成了函数的重载。

    function getSum(a, b) {
        return a - b;
    }
    function getSum(a, b, c) {
        c = c || 0;
        return a + b + c;
    }
    console.log(getSum(1, 2));

      比如说上面这段代码,程序运行的结果是3,为什么是3呢?在JS中,如果有重名的函数,那么后面的函数会将前面的函数覆盖掉。所以这段代码只会执行后面那个函数,而前面的函数则被后面的函数给覆盖掉了。

      还有一个就是作用域的问题,跟其他语言不同的是,JS中是没有块级作用域的,所谓的块级作用域,就是一个{}之间包裹的区间。但是,JS中有全局作用域和局部作用域。全局作用域就是同一个页面中的script标签之间的区域。在全局作用域中的变量是可以在任何地方都能访问到的。而局部作用域则是函数内部的作用域,在函数内部定义的变量则是局部变量。在这里,不得不提一点就是变量的赋值前都会有一个var关键字,如果在函数内部没有用var定义的变量,这个变量就会变成全局变量,会造成变量的污染。

     

  • 相关阅读:
    Delphi程序流程三(2)(while)PS:最简单的任务管理器( 组件LISTVIEW的用法 增加LISTVIEW的读取 删除)
    Delphi 编译错误信息表(转载自万一博客)
    Delphi程序流程三(1)(while)PS:顺便写了个最简单的任务管理器(包含申明API 自己申明参数为结构型API 组件LISTVIEW的用法)
    Delphi程序流程二(for)
    内核编程 warning C4273: 'PsGetProcessId' : inconsistent dll linkage
    简单的SEH处理
    【转】VC6.0各个文件说明
    【转】两篇关于__security_cookie的介绍
    完美解决 error C2220: warning treated as error
    【转】IDA 与VC 加载符号表
  • 原文地址:https://www.cnblogs.com/wqc5730/p/5724886.html
Copyright © 2011-2022 走看看