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不能省略

  • 相关阅读:
    SQL Server UPDATE JOIN
    visual studio 使用正则表达式实现代码批量查找和替换
    AngularJs
    Entity Framework Power Tools 执行数据库反向工程时报错....
    SVN-无法查看log,提示Want to go offline,时间显示1970问题
    windows server安装dotnet-sdk-2.2.108-win-x64.exe时报dll找不到
    いいい
    あああ
    datatable 行列转换
    .net生成随机验证码图片
  • 原文地址:https://www.cnblogs.com/manru75/p/10405047.html
Copyright © 2011-2022 走看看