美文网首页
call和apply

call和apply

作者: liudai123 | 来源:发表于2017-11-22 19:05 被阅读12次

    call()和apply()作用都是改变对象的执行上下文,也就是函数中this的指向。

    JavaScript中this的指向。
    首先明确两个概念,函数和方法:

    函数:当一个函数不是一个对象的属性时,我们称之为函数。
    方法:当一个函数被保存为对象的一个属性时,我们称之为方法。
    1.this

    1.函数调用模式:this指向window;
    2.方法调用模式:this指向调用当前方法的对象;
    3.构造函数调用模式:如果函数是new调用的,此时this指向创建出来的新对象上;
    4.上下文调用模式:也就是本文的call和apply,可以指定这个函数的this指向;
    5.bind:创建一个新的函数,可以绑定新的函数的this指向,当绑定了新函数的this指向后,无论使用何种调用模式,this都不会改变。
    参数:新函数的this指向;
    返回值:新的函数。
    var newFn=fn.bind(window);将新数组的this指向了window
    

    2.call

    1.释义:可以调用一个函数,并且可以指定这个函数的 this 指向。
    2.参数:
    参数一,指定函数内部的 this 指向,不传默认为window;
    参数二,接收若干个参数,这些参数将会作为function的参数传入function;
    fn.call(thisArg,arg1,arg2,arg3);==fn(arg1,arg2,arg3)
    3.apply

    1.释义:可以调用一个函数,并且可以指定这个函数的 this 指向。
    2.参数:
    参数一,指定函数内部的 this 指向,不传默认为window;
    参数二是数组或者伪数组,里面存放了所有的参数列表。(这也是call和apply的区别)
    apply有一个特性,平铺特性,apply会把数组里面的每一项都当成参数传入函数。
    fn.apply(thisArg,[arg1,arg2,arg3]);==fn(arg1,arg2,arg3)

    call 和 apply 和 bind :
    三者都可以把一个函数应用到其他对象上,注意不是自身对象。apply,call 是直接执行函数调用, bind 是绑定,执行需要再次调用.
    apply 和 call 的区别是 apply 接受数组作为参数,而 call 是接受逗号分隔的无限多个参数列表
    补充:伪数组

    1.伪数组其实就是一个对象,但是跟数组一样,伪数组也会有length属性,也有0,1,2,3等属性。
    2.数组并没有数组的方法,不能使用push/pop等方法
    3.数组可以跟数组一样进行遍历,通过下标操作。
    4.常见的伪数组:arguments、document.getElementsByTagName的返回值、jQuery对象
    5.伪数组借用数组的方法:Array.prototype/ [ ].push.call(arrLike, "赵六");
    6.将伪数组转换成真数组:var arr = Array.prototype/ [ ].slice.call(arrLike);

    相关文章

      网友评论

          本文标题:call和apply

          本文链接:https://www.haomeiwen.com/subject/ehyovxtx.html