1:使用不带括号的函数名,是调用函数指针,而不是调用函数。
2:函数没有重载。(产生了覆盖)
function sum(nub){
return nub+10;
}
function sum(nub){
return nub+20;
}
sum(10); //输出30
3:解析器会率先读取函数声明,并在函数之前就可以执行。而函数表达式,则执行到调用代码时才会执行。
sum(a+b); var sum = function(a+b){ return a+b;
}
function sum(a+b){
return a+b;
}
4:作为值的函数
function callFunction(somefunction,A){
return somefunction(A);
}
function somefunction(a){
return a;
}
var re = callFunction(somefunction,10);
alert(re)
5:函数内部属性 arguments,caller,this
arguments 的主要用途是保存函数参数,但这个对象还有个叫callee 的属性,该属性是个指针,指向拥有这个arguments 对象的函数。
function factorial (num){
if(num<=1){
return 1;
}else {
return num * arguments.calee(num - 1); //等价于 return num * factorial(num -1);
}
}
caller 这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为null.
function outer(){
inner();
}
function inner(){
alert(inner.caller); //等价于 alert(arguments.callee.caller);
}
outer();
//输出:
6:每个函数都包含俩个非继承而来的方法:apply() 和 call(). 这俩个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
(1)apply()方法和call()方法区别就在于接收的参数不同。apply 方法接收俩个参数:一个是在其中运行函数的作用域,另一个是参数数组。第二个参数可以是Array 的实例,也可以是arguments对象。
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
(2)call() 传递给函数的参数必须逐个列举出来
function sum(num1,num2){
return num1+num2;
}
function callSum(num1,num2){
return sum.call(this,num1,num2);
}
alert(callSum(10,10));//20
(3)在没有参数情况下,选择哪个方法都可以。传递参数本非apply() 和 call()的真正的用武之地,它真正强大的地方是能够扩充函数赖以运行的作用域。
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
(4)ECMAScript5 中还定义个bind()方法。这个方法会创建一个函数的实例,其this 值会被绑定到传给bind()函数的值。(作用和call()apply()一样)
window.color = "red";
var o = {color : "blue"};
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);objectSayColor(); //blue