每个函数都是Function类型的实例
三种创建函数的方法:
// 方法一
function sum(num1, num2) {
return num1+num2;
}
//方法二
var sum = function(num1, num2) {
return num1+num2;
};
//方法三
var sum = new Function(“num1”, “num2”, “return num1+num2;”);
最好不用方法三去创建函数,但是方法三可以更清晰的看到,函数就是一个对象,通过new实例化得到。而函数名就是一个保存此对象的引用。
也正是因为函数名就是一个特殊的变量,所以,在JavaScript中,没有函数重载这一说,有的只是覆盖。
函数声明提升:函数的声明可以提升到作用域的顶层,从而在函数创建之前调用函数也不回导致错误:
alert(sum(1, 2));
function sum(a, b) { return a + b }
上面说到函数其实就是一个特殊的变量,所以作为一个值的函数有以下作用:
- 函数作为另一个函数的参数。
- 函数作为另一个函数的返回值。
在函数内部有两个特殊的对象:arguments, this 。
arguments:arguments是一个类数组对象,里面保存着调用函数时传入函数的参数
arguments有一个叫callee的属性,arguments.callee保存着这个函数的引用。
this:this引用的是函数执行的环境对象。
函数作为对象本身有两个对象:length, prototype 。
length:length属性是声明函数时参数的个数。
prototype:prototype里面保存着Function类的实例方法。
函数作为对象有三个方法:call(), apply(), bind() 。
三个方法的作用都是改变函数内部的this对象的引用。
apply():apply方法的第一个参数是一个对象,用来替代调用该方法的函数的this,第二个是一个数组,保存着函数的参数。
call():call方法的第一个参数的作用与call相同,不同的是,后面的参数可以是多个,每一个都是函数的参数。
bind():bind方法也可以修改作用域,但不同的时,此方法会返回一个新的函数,这个新的函数中的this会是bind方法中传入的参数对象。
网友评论