js call apply的使用

先说下区别 ,似乎除了参数之外没什么区别 apply第二个参数是一个数组

都是5.5的版本中出现的

言归正传

先看 call 


文章的大概意思就是其  调用一个对象的一个方法,以另一个对象替换当前对象




call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 


thisObj  可选参数 将被用作当前对象的对象
arg1 , arg2,....
可选 将被传递方法序列


call方法可以用来代替另一个对象调用一个方法,call方法可将一个函数的对象上下文从初始的上下文改变为thisObj指定的新对象


顺便提一句如果没有thisObj对象,那么global对象就是thisObj对象



啥也不说了 来个例子就明白了 


 function add(a,b){
 	alert(a+b);
 }
 function sub(a,b){
   alert(a-b);
 }

 add.call(sub,3,1);

你会发现运行的结果竟然是4 ,这是为什么呢?

其实就是add 替换了sub 然后 3 ,1 当做参数传递add 所以最后运行的结果就是4 


在运行一下这个代码

function add(){
 	 this.name = "long";
 	 this.sendName = function(){
 	 	alert(this.name)
 	 }
 }
 var add = new add()
 add.sendName()

然后在运行


 function add(){
 	 this.name = "long";
 	 this.sendName = function(){
 	 	alert(this.name)
 	 }
 }
function addName (){
	this.name = 'zhang';

}
var add = new add();
var addName = new addName();
add.sendName.call(addName)

这个意思是将add的sendName方法放在addName中执行 所以运行的结果就是zhang


重头戏来了,call和apply用的最多的地方,,,,继承

先来个简单的例子方改变理解


 function add(){
 	 this.name = function(){
 	 	console.log("aaaa")
 	 }
 }
 function send(){
 	add.call(this);
 }
 var send = new send();
 send.name()

什么?send怎么会有name方法  。。。。?????

这就是使用call实现的继承  add.call(this)的意思就是使用add对象来替代this对象,,而this指向的谁呢?所以send不就用了add的属性和方法了吗,,所以我们就很容易理解send调用add的方法是怎么回事了。

 function add(){
 	 this.name = function(){
 	 	console.log("aaaa")
 	 }
 }
function send(){
	this.send =function(){
		console.log("bbb")
	}
}
function end(){
	add.call(this);
	send.call(this)
}
var end = new end();
end.name();
end.send();

这个例子是实现多重继承的。。怎么样很好理解吧????

说了这么多的call ,apply存在感似乎有点低,现在说一个apply使用的话怎么装逼



		var  arr=  [3,41,5,74,2];

		alert(Math.max(arr))
		function arrs(arr){
			for(var i = 0 , arrar =arr[0] ; i < arr.length ; i++ ){
				arrar = Math.max(arrar , arr[i])
			}
			return arrar;
		}
		arrs(arr)

		function applyMax(arr){
			return Math.max.apply(null,arr)
		}
		applyMax(arr)


运行一下


然后再来一个push的数组

		var  arr=  [3,41,5,74,2];
		var arrLast = [1111,22222]

		function arrar(arr,arrLast){
			for(var i = 0 ; i < arrLast.length ; i++){
				arr.push(arrLast[i])

			}
			return arr;
		}
        arrar(arr,arrLast)

这似乎是一种常见的写法,,要是就这么结束了,那不是打脸啊。。。


	var  arr=  [3,41,5,74,2];
		var arrLast = [1111,22222]

		function arrar(arr,arrLast){
			Array.prototype.push.apply(arr,arrLast)
			return arr
		}
        arrar(arr,arrLast)


最后运行一下这段代码,,




对于我们前端来说框架只不过是一种工具,但是基础确实我们在市场上存活的唯一法宝,,加油。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章