javascript学习笔记

五 Function类型

  每个函数都时Function类型的实例。函数也是对象。

  声明函数:

    function func_name () {}       //javascript解析器会在程序执行时率先读取函数声明,使其在执行任何代码之前可用(可访问)  
    var func_name = function(){};  //解析器执行到它所在的代码行,才会被解释执行。

  因此函数名是个变量,保存的是指向函数对象的指针,不会与某个函数绑定,与包含对象指针的其他变量没什么区别。

  1.没有重载

    声明两个同名的函数,第二个会覆盖掉第一个

  2.作为值的函数

    函数名本身就是变量。因此函数体可以当作值来使用。可以当参数进行传递,也可以当其他函数的返回值。

function callSomeFunction (someFunction, someArgument){
      return someFunction(someArgument);  
}

      3.函数内部属性

    函数内部有两个特殊的对象:arguments 和 this 

    *arguments对象保存的是所有传入函数内部的参数。

    *arguments.callee。这是一个指针,指向拥有该arguments对象的函数

复制代码
function factorial(num) {
    if(num <=1){
       return 1;
    }else{
       return num*arguments.callee(num-1);//递归调用
       //相当于:
       //return num*factorial(num - 1); 
       //这样消除了函数名与内部递归调用函数名的紧密耦合性
    }
}
复制代码

             *this 引用的是函数据以执行的环境的变量对象。

             *caller 对象属性。此属性保存的是调用当前对象的函数的引用。如果在全局作用域中调用当前函数,值为null

复制代码
function outer()
{
     inner();  
}

function inner()
{
     alert(arguments.callee.caller);
}

outer();//返回outer()函数的源代码
复制代码

      4.函数属性和方法

    length ---  FunctionObject.length 函数参数的个数。函数没有参数,则返回0

    apply() --- Function.apply(scope[ ,Function.arguments||Array])//传递的参数可以为Arguments对象,也可以为参数数组

    call() ---   Function.call(scope[, argument1,argument2,.......])//所要传递的参数必须一一列举吹来

    这两个函数都是扩展它自身运行时所在的作用域。参数1,这两个函数运行时所在的作用域(一般都为对象);参数2, 传递给这个函数的参数。

复制代码
window.color = 'red';
var o = {'color':'blue'};

function sayColor(){
     alert(color);      
}

sayColor(); // red

sayColor.call(this) //red
sayColor.call(window) //red
sayColor.call(o) //blue
复制代码

    使用这两个函数的好处是:降低对象与方法之间的耦合性。

原文地址:https://www.cnblogs.com/mysic/p/5384169.html