js改变this指向方法call,apply;jq改变this指向方法$.proxy()


这些都是昨天看的一些博文,觉得很好,所以总结一下,避免自己不小心就忘掉了,当然后面有时间肯定会更加深入研究

http://www.cnblogs.com/qzsonline/archive/2013/03/05/2944367.html

call()与apply()区别

一、方法的定义 
call方法: 
语法:call(thisObj,Object)          //对象,参数集
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 

apply方法: 
语法:apply(thisObj,[argArray])   //对象,数组
定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
说明: 
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

http://www.cnblogs.com/fighting_cp/archive/2010/09/20/1831844.html

call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.既然作为方法的属性,那它们的使用就当然是针对方法的了.这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同.

//apply call 的用法
             function Animal(name) {
                     this.name = name;
                     this.showName = function() {
                             console.log(this.name);
                         };
                 }

             function Cat(name) {
                     Animal.call(this,name);
                 }
             Cat.prototype = new Animal();

             function Dog(name) {
                     Animal.apply(this,name);
                 }
             Dog.prototype = new Animal();

             var cat = new Cat("Black Cat"); //call必须是object

             var dog = new Dog(["Black Dog"]); //apply必须是arra
             cat.showName();//Black Cat  去掉this  打印undefined
             dog.showName();//Black Dog  去掉this  打印undefined

             console.log(cat instanceof Animal);
             console.log(dog instanceof Animal);
call的使用情况
var func = function(a){  //这里只有一个参数
    console.log(a) //2

}
func.call(0,2,3);//call里面0不算?这个还需要再研究一下
   2,3中上面只有一个参数所以选择第一个参数,那么最后上面打印2
apply的其他使用方法

http://blog.csdn.net/myhahaxiao/article/details/6952321

    apply的一些其他巧妙用法

细心的人可能已经察觉到,在我调用apply方法的时候,第一个参数是对象(this), 第二个参数是一个数组集合, 在调用Person的时候,他需要的不是一个数组,但是为什么他给我一个数组我仍然可以将数组解析为一个一个的参数,这个就是apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) 这个如果让我们用程序来实现将数组的每一个项,来装换为参数的列表,可能都得费一会功夫,借助apply的这点特性,所以就有了以下高效率的方法:

a)        Math.max 可以实现得到数组中最大的一项

因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组

但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决 var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项(apply会将一个数组装换为一个参数接一个参数的传递给方法)

         这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去


       最后挂一个一不小心在网上看到的面试题,想了老半天自己都想不通,后面还是看了大神的解析才看懂的,突然找不到网址了,但是我就写大概思路吧,主要是官方的我看不懂解释,当时是欲哭无泪的;好不容易找了一个自己能理解的;现在才发现为嘛官方的没看懂,就是第二天没理解,所以先默哀一下。放一下官方解析链接:

http://blog.csdn.net/bbirdsky/article/details/9232365

var a = Function.prototype.call.apply(function(a){return a;}, [0,4,3]);alert(a);   //4这就要想为什么了

1、将Function.prototype.call当成整体,call方法是由浏览器实现的本地方法,是函数类型的内部方法

call.apply(function(a){return a;}, [0,4,3]);

2、fun.apply(obj,args)等价于obj.fun(args),这一步是重点,必须理解!

function(a){return a;}.call(0,4,3);//这里肯定上面的规则很重要,直接apply就被转化了,直接作用就是为了将数组转化为了单个的参数

后面根据call()里面参数为0直接忽略,参数只有一个,所以在4,3中取第一个参数也就是4,所以最后的值为4


$.proxy(fn,context)改变this的指向  fn必须是一个函数

eg:$(function(){ //$.proxy()改变this指向
/* function show(n1,n2){
alert(n1)
alert(n2)
}//
//show()//object window
$.proxy(show,document,3)(4)//这里要加括号   object document   想要改变指向的this执行就加括号
//传参   输出3,4

      var obj={
      show:function(){
      alert(this)
      }
      }
   //   $(document).click(obj.show) //HTMLdocument
     // $(document).click($.proxy(obj.show,obj))//object   将obj.show里面指向的document改为object
     $(document).click($.proxy(obj,'show'))   ===  $(document).click($.proxy(obj.show,obj))  //两种情况,一个是字符串一个是函数*/})


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页