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

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

原文地址:https://www.cnblogs.com/socialdk/p/3055034.html