我对call与apply的一些理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40169665/article/details/78531553
call与apply:
call与apply最重要的一个作用就是改变函数内的上下文(其实就是改变函数内this的指向)
如果不是一个对象内的方法 this均为当前window对象(可自行在控制台下测试):

 
 
function testCall(){
	function yep(){
		for(var i in this){		//取出当前this指向里的属性名或方法名
			console.log(i);
		}
	}
	//yep.call(this);
	yep(); 
}
testCall();

	//yep.call(this)与yep()	这两句无论哪一句执行效果也一样,默认的this就是当前window,所以call传this进去也是当前window,
	将yep放在testCall里面是让你们知道,只要一个函数不是某个对象的方法,那它的this都是指向window
	即使它不是在全局区域链而是在局部区域链里


var o = {
"name" : "GaryCheung",
"age" :18
}
testCall();
function testCall(){
	function yep(){
		for(var i in this){		//取出当前this指向里的属性名或方法名
			console.log(i);
		}
	}
	yep.call(o);	
}
testCall();
//此处传了对象o进去,将yep里面默认指向当前window的this改为了指向对象o的this,所以运行后在控制台输出的只有name跟age;



上面都是以call为例子,实际上apply也是一样的,将上面例子中的call改为apply运行效果也是一样,call与apply两者的差别在于参数的传入。
没错,call与apply不仅可以改变上下文(this的指向,也是call与apply最重要的一点),还可以传入参数,至于为什么要传入参数?你定义的函数,没有参数怎么可以正常运行?
例如
 function name(arg1,arg2){
var sum = arg1 + arg2;
sum  += this.age;
console.log(sum);
}
var o = {
"name" : "GaryCheung",
"age" :18
}
name.apply(o);
//运行后控制台输出的为NaN,因为name需要的参数你没有给它,即函数内有aarg1与arg2的定义,但是没有初始化,所以用起来就是undefined
所以最后的sum就是一个NaN;
那么:
name.apply(o,[12,30]);	//就可以输出60了;



而参数的传入方法区别在于 call只能一个一个参数列举出来,而apply则可以传一个参数数组(如果用到apply的函数在内部,那么arguments也可以传过去),还是用我们上面的函数例子:

name.call(o,18,20);
name.apply(0,[18,20]);
var array = [18,20];
name.apply(0,array);

在我看来,只要记住 call与apply均能改变他们内部this的指向就可以了(用call或者apply传进的第一个参数就是内部this的指向)

猜你喜欢

转载自blog.csdn.net/weixin_40169665/article/details/78531553