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

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

  • 相关阅读:
    1046 Shortest Distance (20 分)(模拟)
    1004. Counting Leaves (30)PAT甲级真题(bfs,dfs,树的遍历,层序遍历)
    1041 Be Unique (20 分)(hash散列)
    1036 Boys vs Girls (25 分)(查找元素)
    1035 Password (20 分)(字符串处理)
    1044 Shopping in Mars (25 分)(二分查找)
    onenote使用小Tip总结^_^(不断更新中...)
    1048 Find Coins (25 分)(hash)
    三个故事
    领导者的举止
  • 原文地址:https://www.cnblogs.com/socialdk/p/3055034.html
Copyright © 2011-2022 走看看