Function.prototype.call()

在JavaScript中最迷人的就是函数,而函数也是对象,所以函数也就拥有了属性和方法,每一个函数都拥有两个属性,一个是length和prototype。

在js中每个函数都有两个方法:call(),apply()。这两个方法的作用就是设置函数体内this指向的值。如下面这个例子:

1
2
3
4
5
6
7
8
9
function sum(n1, n2){
return n1 + n2;
}
function sum1(n1, n2){
return sum.call(this, n1, n2);
}
console.log(sum1(1, 3)); //结果是4

call传递的参数第一个是运行函数所在的作用域,一般情况我们使用的时候是this.当然也可以直接指定作用域,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var name = "Jim";
var p2 = {
name: "Tang",
age: 25
};
function say(){
console.log(this.name);
}
say(); //Jim
say.call(p2); //Tang

后面跟多个直接的参数,这个参数也就是当前使用函数的参数个数比如sum()有几个参数就传递几个参数。这个haoxin给的链接说明了call。而apply()只接受两个参数,一个是作用域,一个参数的数组(也可以是arguments对象)。这个你可以参考上面的链接资料。

当然call()的真正作用还很大。它的作用还可以发挥在继承上面,这里演示一种继承方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function P1(name){
this.name = name;
this.say = function(){
console.log('my name is %s', this.name);
};
}
function P2(name){
P1.call(this, name);
}
var p = new P2("Jim");
p.say(); //这里的结果就是‘my name is Jim’

熟练使用call()可以帮助我们很多!

经不住似水流年  逃不过此间少年
0%