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

  • 相关阅读:
    关于 web service 参数传递的序列化反序列化问题
    (转)GIS理论(墨卡托投影、地理坐标系、地面分辨率、地图比例尺、Bing Maps Tile System)
    (转)如何oracle调试存储过程
    word中字号和磅数的对应
    (转)C# 泛型相关讲解
    16 款最流行的 JavaScript 框架(转)
    mark:about 手势
    UIWebView
    android 无法安装ApiDemos
    Android开发中的单元测试
  • 原文地址:https://www.cnblogs.com/manru75/p/10405047.html
Copyright © 2011-2022 走看看