zoukankan      html  css  js  c++  java
  • JS学习专辑(6) 函数

    然后到函数了,函数的话就是用function来定义,可以用在函数定义表达式(var f=function(arg,arg2,...){...})或者函数声明表达式(function funcname(arg,arg2,...){...})语句里。大多数函数中都会有return语句,可以导致函数停止执行,并返回后面的表达式的值,如果没有return函数就执行完每条语句后返回undefined值给调用者。下面有3个表达式写法的例子:

    View Code
    //最常见的写法
    function f(){
        var a="1";
        return a;
    }
    f();  
    
    //定义表达式写法
    var f=function(){
        var a="1";
        return a;
    }
    console.log(f());    
    
    //这个。。。算是简化过的表达式写法
    console.log((function f(){
        var a="1";
        return a;
    })());   

    除了上面的定义还能用Function()构造函数来定义:var f=new Function("x","y","return x+y;")这个等价于var f=function(x,y){return x+y;},不过Function()构造函数一般不太用,不用去太纠结这个东西。

    在函数调用上,除了最简单的调用外,还可以在对象中调用方法,方法也就是在对象中的函数,比如下面这样:

    View Code
    var c={
        a:1,
        b:1,
        add:function(){
            var self=this;
            console.log((function f(){
                return self.result=self.a+self.b;    //在嵌套函数里面用this是全局对象或者undefined,所以要用上面的self保存this
            })());    //输出5
            return this.result=this.a+this.b;
        }
    };
    c.a=2;
    c.b=3;
    c.add();
    console.log(c.result);    //输出5

    上面的例子中,函数体使用this来引用该对象。嵌套的函数不会从调用它的函数中继承this,如果是方法调用,this就是指调用对象,若是函数调用,就是全局对象或者undefined。如果要在嵌套函数中调用外部函数的this值,就可以向上面例子一样。this的详细用法还可以看看这个:详解JavaScript中的this

    在函数的参数中,当调用的函数的参数比形参少的时候,剩下的多的形参都是undefined,因此在写代码的时候还是要用/*optional*/标示一下哪些形参是可选的。

    View Code
    var f=function(a,/*optional*/b){    // /**/中间的注释来强调形参是可选的
        if(b==undefined) b=a;
        console.log(b);    //4
        return a+b;    
    };
    console.log(f(4));    //8

    当调用函数的参数比形参多的时候,多余的参数可以用arguments[i]来得到,就比如下面的例子:

    View Code
    var f=function(a){
        if(arguments.length!=1){
            for(var i=0;i<arguments.length;i++){
                console.log(arguments[i]);    //1 2 3 4
            }
        }
        console.log(a);    //1
    };
    f(1,2,3,4);

    在函数中还有一个东西要学,那就是闭包,闭包是什么呢?解释很长很抽象, 我觉得它就是一个函数中的函数(好吧这是废话),它是函数的局部变量,它在函数return掉后,它不会被释放掉。可以通过下面的例子来理解闭包:

    View Code
    var i=10
    function a(){
     var i=5;
     function b(){
     console.log(++i);    //i本来从函数外部访问不到,用了闭包就可以变相的访问
     }
     return b;
    }
    var c=a();    //c执行了a函数 c就是a的返回值
    c();    //6    这里的c执行的是b函数 调用的是闭包内部的i
    c();    //7    第一次的执行c()后,a中的i值依旧保存 不会被释放
    console.log(i);    //10 调用的是闭包外面的那个值

    在参数的传递中,还可以通过下面那个例子一样来传递参数,应该也算是闭包的一种应用吧:

    View Code
    var f=(function(a){
       return function(b){return a+b;};
    })(3);    //a是3
    console.log(f(5));    //把5穿入b中,这样结果是8

    函数差不多就这点基础的东西吧,等有撒好东西再补充。

  • 相关阅读:
    HTML 标题
    HTML 属性
    点云配准的端到端深度神经网络:ICCV2019论文解读
    人脸真伪验证与识别:ICCV2019论文解析
    人体姿态和形状估计的视频推理:CVPR2020论文解析
    FPGA最全科普总结
    深度人脸识别:CVPR2020论文要点
    视频教学动作修饰语:CVPR2020论文解析
    分层条件关系网络在视频问答VideoQA中的应用:CVPR2020论文解析
    慢镜头变焦:视频超分辨率:CVPR2020论文解析
  • 原文地址:https://www.cnblogs.com/socialdk/p/3055034.html
Copyright © 2011-2022 走看看