1.3 函数
1.3.1 函数对象
Javascript 中的函数也是对象。函数对象连接到Function.prototype,该原型对象本身
连接到 Object.prototype。
每个函数对象在创建时会有一个prototype属性。它的值是一个拥有 constructor 属性
且值为该函数的对象。
例:
function a(){};
a.prototype.constructor; // function a(){}
函数的不同之处在于它可以被调用。
例:
a(); // 调用函数a
1.3.2 函数字面量
函数对象通过函数字面量来创建:
var reduce = function(a, b){
return a - b;
}
1.3.3 调用
4种调用模式:
方法调用模式
当一个函数被保存为对象的一个属性时,则称其为对象的一个方法。当被调用是this被绑定到该对象。
var obj = {
sum: 0,
add: function(num){
this.sum += num || 1;
}
}
obj.add();
obj.sum; // 1
obj.add(2);
obj.sum; // 3
通过this可取的该对象的上下文的方法称为公共方法。
函数调用模式
当一个函数不是一个对象的属性时,那么该函数被当做一个函数来调用:
function add(a, b){
return a + b;
}
var sum = add(1, 2);
sum; // 3
此模式调用函数时,this会被绑定到全局对象。这是语言设计上的错误。
我们一般通过定义一个变量来给它赋值this。一般是 that 或 _this。
obj.add2 = function(){
var that = this;
var a = function(){
that.sum = add(that.sum, that.sum);
}
a(); // 6
var b = function(){
this.sum = add(this.sum, this.sum);
}
b(); // undefined 该函数中sum为undefined
}
obj.add2();
构造器调用模式
构造函数约定是以大写格式命名函数名的函数,通过new来调用,但是不加上new,也不会警告,
这个很蛋疼。
在上述面前加new来调用时,会默认创建一个连接到该函数的prototype成员的新对象,同时this
也会绑定到这个新对象上。
var Fn = function(value){
this.value = value;
};
Fn.prototype.getValue = function(){
return this.value;
}
var fn = new Fn(1001);
fn.getValue(); // 1001
apply调用模式
apply方法会构建一个参数数组传递给调用函数。也允许选择this的值。
var arr = [1, 2];
var sum = add.apply(this, arr);
sum; // 3
var sum2 = add.apply(null, arr);
sum2; // 3
var o = {
value: 2002
};
var value = Fn.prototype.getValue.apply(o);
value; // 2002
// apply 会把 this 指向 o , 所以会返回 this.value 即 o.value;
每个函数除了声明定义的形式参数,还接收附加的两个参数:
this - 值取决于调用的模式
arguments - 函数的实际参数个数,类似数组,但不是数组
调用函数时函数参数个数不匹配是不会导致运行错误,多的参数会被忽略,少的参数会默认是undefined。
例:
function add3(a, b, c) {
console.log("" + a + b + c);
}
add3(1, 2, 3, 4); // 123
add3(1, 2); // 12undefined
——–内容系个人整理,如有错误,欢迎指出。谢谢!——–