函数本质
javascript中的函数本质都是Function引用类型的实例,即函数就是一个Function类型的对象
函数定义
1.声明方式:
如:
function func(num){
return num+1;
}
2.函数表达式方式
var func=function(){
return 'hello';
}
3.new方式
var func=new Function("num1","num2","return num1+num2") //最后一个参数就是函数体,前面都是函数参数
函数没有重载
js中函数没有重载,因为函数名就是一个保存函数对象引用的变量
如:
function addSomeNumber(num){
return num + 100;
}
function addSomeNumber(num) {
return num + 200;
}
实质:
var addSomeNumber = function (num){
return num + 100;
};
addSomeNumber = function (num) {
return num + 200;
};
函数对象的属性
1.this
指向函数执行时的外部作用域对象
2.arguments
指向保存参数的一个类数组对象,arguments对象有一个属性callee,这个属性执行函数对象,有趣的是构成了一个循环,函数对象的arguments指向参数对象,参数对象的callee属性执行函数对象。
举例:
function factorial(num){ if (num <=1) { return 1; } else { return num * factorial(num-1); //这个求阶乘的函数和函数名严重耦合,如果将函数引用赋值给其他变量将来使用此函数将报错 } }
var trueFactorial = factorial; factorial = function(){ return 0; }; alert(trueFactorial(5)); //递归结果不对,factorial执行的函数变成了一个返回0的函数 alert(factorial(5)); //结果0
function factorial(num){ if (num <=1) { return 1; } else { return num * arguments.callee(num-1); //这样是松耦合的,和函数名就没有关系 } }
3.caller执行函数执行时的外部函数作用域对象,这个属性强调的是函数外部执行环境必须是一个函数,如果不是那么这个属性值为null
如:function outer(){ inner(); } function inner(){ alert(arguments.callee.caller); //弹窗显示的是outer函数,即caller属性指向outer函数对象 } outer();
4.lengthlength属性表示函数形参个数
5.prototype
prototype属性执行函数对象的原型,任何引用类型都有原型,都是通过构造函数中的prototype属性引用的
函数对象中的方法
apply和call方法这两个方法效果一样,只是传递参数的方式不一样,第一个参数函数执行的外部作用域对象,后面参数就是函数参数如:function sum(num1, num2){ return num1 + num2; } function callSum1(num1, num2){ return sum.apply(this, arguments); // 传入 arguments 对象 } function callSum2(num1, num2){ return sum.apply(this, [num1, num2]); // 传入数组 } alert(callSum1(10,10)); //20 alert(callSum2(10,10)); //20
//call方法 function sum(num1, num2){ return num1 + num2; } function callSum(num1, num2){ return sum.call(this, num1, num2); } alert(callSum(10,10)); //20
//作用域的不同执行效果不一样 window.color = "red"; var o = { color: "blue" }; function sayColor(){ alert(this.color); } sayColor(); //red sayColor.call(this); //red sayColor.call(window); //red sayColor.call(o); //blue