函数内部属性(重点)
- 在函数内部,有两个特殊的对象:arguments和this。
- arguments的主要用途是保存函数参数,这个对象还有一个名叫callee的属性
- this引用的是函数据以执行的环境对象
// callName();
// console.log(callName()); //NaN
// sum()
console.log(sum2(5,2));
console.log(factorial(5));
// 函数声明
function callName(){
alert('hello');
}
function callName(val1,val2){
return val1+val2;
}
// factorial
// 与函数名紧紧耦合
// 使用arguments.callee替代函数名,消除耦合
// 无论引用函数时使用的是什么名字,都可以保证正常完成递归调用
function factorial(n){
if(n<=1){
return 1;
}else{
return n * arguments.callee (n - 1);
}
}
function sum (val1,val2){
return val1+val2;
}
function sum1 (val1,val2){
return sum.apply(this,arguments);
}
function sum2 (n1,n2){
return sum.call(this,n1,n2);
}
var sum = function (val1,val2){
return val1+val2;
}
console.log(sum(1,2));
函数属性和方法(重点)
- ECMAScript中函数是对象,因此也有属性和方法。
- 每个函数都包含两个属性:length和prototype
- 其中,length表示函数希望接收的命名参数的个数;
- 对于ECMAScript中的引用类型来说,prototype是保存他们所有实例方法的真正所在。
- 在ECMAScript 5中,prototype属性是不可枚举的,因此使用for-in无法发现。
- 每个函数都包含两个非继承而来的方法:apply()和call()
- ECMAScript 5还定义了一个方法:bind()
window.color = "red";
var o = { color: "blue" };
function sayColor() {
console.log(this.color);
}
// sayColor();
// sayColor.call(this);
// sayColor.call(o);
// sayColor.call(this.o);
// this值会被绑定到传给bind() 函数的值
var othis = sayColor.bind(o);
othis();
console.log(typeof(othis)) //function