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