Una

接下来的日子,陆续把未总结的问题补充起来......

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值.

 apply()接收两个参数:一个参数是在其中运行的作用域,另一个是参数数组(可以是Array实例,也可以是arguments对象).

实例:

function sum(num1,num2) {
	return num1+num2;
}

function applySum1(num1,num2) {
 return	sum.apply(this,arguments);
 
}

function applySum2(num1,num2) {
 return	sum.apply(this,[num1,num2]);
 
}

console.log(applySum1(10,10));//20
console.log(applySum2(10,10));//20

 

call()方法,第一个参数和apply()一样,是在其中运行的作用域即this;和apply()不同的是,call()方法中的其余的参数必须直接传给函数,即在使用call()方法时参数必须逐个的列出来.

实例:

function sum(num1,num2) {
	return num1+num2;
}

//function applySum1(num1,num2) {
// return	sum.apply(this,arguments);
// 
//}
//
//function applySum2(num1,num2) {
// return	sum.apply(this,[num1,num2]);
// 
//}

function callSum1(num1,num2) {
	return sum.call(this,num1,num2);
}
console.log(callSum1(10,10));//20

 

apply和call的区别只是除了第一个this参数外,其余参数的传递方式不一样,apply的其余的参数可以用Array实例和arguments对象传递,call的其余参数必须逐个列出.两者最后得到的结果一样.

 

apply和call真正的用处是扩充函数的作用域:

实例1:

//一般方法
color = "red";
var o = {color:"blue"};
function sayColor() {
	console.log(this.color);
}

sayColor();//red
o.sayColor();//报错
o.sayColor = sayColor;//给对象o添加一个sayColor方法,然后让其指针指向全局作用域中的sayColor函数
o.sayColor();//blue

  

实例2(call方法和apply方法一样效果):

color = "red";
var o = {color:"blue"};
function sayColor() {
	console.log(this.color);
}

//sayColor();//red
//o.sayColor();//报错
//o.sayColor = sayColor;//给对象o添加一个sayColor方法,然后让其指针指向全局作用域中的sayColor函数
//o.sayColor();//blue

//采用apply或call方法解决对象和方法耦合的问题
sayColor.call();//red
sayColor.call(o);//blue
sayColor.call(this);//undefined
sayColor.call(window);//window is not defined

测试结果:

 

最后的测试结果和《javascript高级程序第3版》中的有点不一致(原因待分析):

 

8-16补充:全局对象window,本身就是浏览器中的对象,所以在命令行窗口下测试是不能得到书中的结果的.

                浏览器下测试结果:

                

 

posted on 2016-08-15 17:34  youyi2016  阅读(1746)  评论(0编辑  收藏  举报