函数的属性和方法:
ECMAScript中的函数是对象,因此也有属性和方法,每个函数包含两个属性和方法:length和prototype.其中,length属性表示函数希望接受的参数的个数举个例子;
function sayName(name){
alert(name);
}
function sum (num1,num2){
return num1+num2;
}
function sayHi(){
return alert("hi");
}
console.log(sayName.length); //1
console.log(sum.length); //2
console.log(sayHi.length); //0
在ECMASCript所定义的全部属性中,prototype属性最为非一般.对于ECMAScript中的引用类型来说,prototype是保存他们所有实例方法的真正所在.换句话说,诸如toString()和valueOf()等方法实际上那个都保存在prototype名下,只不过都是通过各自的实例访问罢了.
每个函数都包含两个非继承而来的方法:apply()和call().两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值.首先,apply()方法接受两个参数,一个是在其中运行的函数,另一个是参数数组.其中,第二个也可以是Array数组,也可以是arguments对象.举个例子;
function sum(num1,num2){
return num1+num2 ;
}
function callSum1(num1,num2){
return sum.apply(this,arguments);
}
function callSum2(num1,num2){
return sum.apply(this,[num1,num2]);
}
alert(callSum1(10,10));
alert(callSum2(10,10));
而call方法作用和apply()方法一样,只是接受参数的方式不同而已,call()方法给函数传递的参数必须逐个列举出来.
另外,还定义了一个方法:bind(),这个方法会创建一个函数的实例,其this的值会被绑定到传给bind()函数的值.
举个例子:window.color = "red";
var o = {color :"blue"};
function sayColor(){
console.log(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor();
上面的例子中,sayColor()函数调用了bind(0函数并且传入对象o,创建了objectSayColor函数,objectSayColor的this的值等于o.因此,即使在全局作用域中调用这个函数,也会看到"blue".