zoukankan      html  css  js  c++  java
  • 前端技能大挑战-3(修改this指向)

    说题目之前先总结下call,apply,bind

    共同点:

    (1)改变this指向

    (2)第一个参数都是this要指向的对象

    (3)都可以利用后面传参

    不同点:

    (1)传参方式不同

    (2)bind返回的是一个函数,仅仅this指向改变了,还需继续调用

    例子(无参数情况)

    var mr = {
         name: 'Mrc ',
         say: function () {
             console.log(this.name);      
        }
    }
    
    var ty = {
        name: 'ty',
        say: function () {
             console.log(this.name);      
        }
    }
    

    call:

    mr.say.call(ty)

    apply:

    mr.say.apply(ty)

    bind:

    mr.say.bind(ty)()

    无参数情况下,call和apply用法一样

    例子(有参数情况)

    var mr = {
         name: 'Mrc ',
         say: function (sex,hobby) {
             console.log('姓名:' + this.name + ',性别:' + sex + ',爱好:' + hobby);      
        }
    }
    
    var ty = {
        name: 'ty',
        say: function (sex,hobby) {
             console.log('姓名:' + this.name + ',性别:' + sex + ',爱好:' + hobby);      
        }
    }
    

      

    call:

    mr.say.call(ty , '女' , '吃')

    apply:

    mr.say.apply(ty  ,['女' , '吃'])

    bind:

    mr.say.bind(ty , '女' , '吃')()

    mr.say.bind(ty)('女' , '吃')

    接下来进入正题

    题目描述

    封装函数 f,使 f 的 this 指向指定的对象
    function bindThis(f, oTarget) {
        //方法1 apply()
        return function(){
            return f.apply(oTarget,arguments);
        };
        //方法2 bind()
        return f.bind(oTarget);
        //方法3 call()
        return function(x,y){
            return f.call(oTarget,x,y);
        };
    }


    为什么有匿名函数,是因为apply call 是绑定之后是立即调用的,

    所以需要匿名函数包装且需要传入原函数的参数argumengts. bind 会创建一个新函数,即函数副本,绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。

    所以想表达的意思是arguments不能省略

  • 相关阅读:
    关于jsp页面是放在webroot目录下和web-inf下优缺点
    eclipse查看jar包中class的中文注释乱码问题的解决
    如何在eclipse里使用git
    ****JFinal 部署在 Tomcat 下推荐方法
    jfinal框架教程-学习笔记(二)
    Struts2 标签库讲解
    struts2 标签库 介绍
    VC无闪烁刷屏技术的实现【转】
    小知识:SPI四种模式区别【转】
    如何在Android 或Linux 下,做Suspend /Resume 的Debug【转】
  • 原文地址:https://www.cnblogs.com/manru75/p/10405047.html
Copyright © 2011-2022 走看看