JS中的神器-函数

函数是JS的灵魂,在JavaScript中函数本身也是对象。今天就扒一扒js的函数,看看她里面到底是什么东东!要想搞函数,先的有函数,那么在JS中怎么搞一个函数出来的?

 

一 .定义函数的方式:

第一种:

function test(){
   alert("I am a function");
}



第二种:

var a = function test(){
   alert("I am a function");
}



一般会定义成匿名函数

var a = function (){
   alert("I am a function");
}




第三种方式:Function 对象(注意F是大写的哦)

在JS中有一个内置的Function对象,JS中所有的函数都是Function类型的(包括我们自定义的函数),这个Function对象接受的所有参数都是字符串类型的;体最后一个参数就是要执行的函数,上面的函数改成这种形式就应该这样写:

var a = new Function("alert("I am a function");");

以上这个函数只有函数体部分,当然我们可以定义传递参数的

var test = new Function("msg","alert(msg);");
test("I am Function "); // 调用函数
//<span style="font-family: Arial, Helvetica, sans-serif;">这种写法也等价于</span>

 var test = function(msg){
    alert(msg);
 }
 test("I am Function ");



以上就是第三种定义函数的方式,当然这种效率并不高,也不常用!!但是如果对Function这个对象有详细的了解,对于我们搞懂JavaScript函数是非常非常有帮助的。

例如:之前说过JavaScript中没有重载的概念。

function add(num1) {
        alert(num1+10);
    }
    function add(num1,num2) {
        alert(num1+20);
    }
add(10); // 调用 弹出30,而不是20,为什么那?



如果写成下面Function对象的形式,一眼就明白原因了

var add = Function("num1"," alert(num1+10);");// Function对象1
 var add = Function("num1","num2"," alert(num1+20);"); // Function对象2

开始add这个引用指向Function对象1,接着又指向了Function对象2,接着调用add就是调用的Function对象2啦,所以就弹出30了

既然Function是个对象,下面必然有一些属性和方法

Function对象的属性:arguments, length , caller ,callee, constructor, prototype.

Function 对象的方法: apply,call,bind,toString,valueof

 

之前说了JS中函数也是对象,JS中所有的函数都可以看作是Function这个对象的实例,因此Function这个对象所有的属性和方法,其他的函数也都拥有这些属性和方法了。

 

arguments属性:

自然JS中所有的函数都 有arguements属性,arguments表示 给函数“实际”传递的参数

function add(num1,num2) {
        alert(arguments[0]);
        alert(arguments[1]);
        alert(arguments[2]);
        alert(arguments.length); // 3
 }
add(2,3,4);
alert(add.length); // 2



虽然function add()里定义了两个参数,但是我们调用add是传了2,3,4 三个参数,就是我们“实际传递的参数”,所以arguments.length打印出是3;

每一个函数都有length属性,该属性表示函数“期待”接受参数的个数,function add(num1,num2)  里定义了2个参数,就表示期待接受2个参数,所以alert(add.length)结果是2