•每一个函数都包含两个非继承而来的方法:call、apply。这俩个方法的用途都是在特定的作用域中调用函数,实际上等 于设置函数体内this对象的值。
•call、apply的用途之一就是传递参数,但事实上,它们真正强大的地方式能够扩充函数赖以运行的作用域。
•使用call()、aplly()来扩充作用域的最大好处就是对象不需要与方法有任何耦合关系。
//call apply简单的用法,绑定一些函数,用于传递参数 调用
function test(a,b){
return a + b;
}
function testcall(num1,num2){
//将test函数绑定到当前的函数上,我要使用test方法
return test.call(this,10,20);
}
function testapply(num1,num2){
return test.apply(this,[num1,num2]);
}
console.log(testapply(10,20));
//扩充作用域
window.color = 'red';
var obj = {color:'blue'};
var obj2 = {color : 'yellow'};
function showColor(){
console.log(this.color);
}
//使作用域不断的变化,根据你传递的参数不同,绑定的作用域也不同
showColor.call(this); //red
showColor.call(obj); //blue
//call方法的简单模拟与实现
function test(a,b){
return a + b;
}
//首字母大写是约定俗成的方式定义对象
function Obj(x,y){
//内部定义一个x。y
this.x = x;
this.y = y;
return x * y;
}
var o = new Obj(10,20);
//内部一个简单的实现
o.method = test;
console.log(o.method(o.x,o.y));
delete o.method;
console.log(test.call(o,o.x,o.y));