zoukankan      html  css  js  c++  java
  • bind函数详解(转)

    var name = "The Window";
    var object = {
        name: "My Object",
        getNameFunc: function () {
            return function () {
                return this.name;
            }
        }
    };
    
    alert(object.getNameFunc()()); //"The Window"

    object.getNameFunc()返回一个匿名函数,在全局环境调用该函数,this指向的全局对象

    解决这一问题,可以像下面这样,将匿名函数外部作用域中this对象保存在闭包能够访问到的变量中

    var name = "The Window";
    var object = {
        name: "My Object",
        getNameFunc: function () {
            var that = this;
            return function () {
                return that.name;
            }
        }
    };
    
    alert(object.getNameFunc()()); //"My Object"

    上述解决方法需要修改对象的方法,如果不能修改原对象的方法,该如何做呢?

    这时,我们可以像下面这样,使用apply或call方法指定函数的作用域

    var name = "The Window";
    var object = {
        name: "My Object",
        getNameFunc: function () {
            return function () {
                return this.name;
            }
        }
    };
    var func=object.getNameFunc();
    alert(func.apply(object)); //"My Object"

    通过apply、call,已经可以输出预期的My Object

    但是,每次调用时都需要以func.apply(object)的形式调用,这不是很怪么

    理想的调用方式,当然是在通过某种处理后,之后可以以func()形式调用,像下面这样

    var name = "The Window";
    var object = {
        name: "My Object",
        getNameFunc: function () {
            return function () {
                return this.name;
            }
        }
    };
    var func=object.getNameFunc();
    func=func.bind(object);
    alert(func()); //"My Object"
  • 相关阅读:
    模拟赛QAQ
    复习计划
    luogu P1080 国王游戏
    [NOIP2012T3]开车旅行
    luogu P1967 货车运输
    同余方程组的扩展欧几里得解法
    luogu P1476 休息中的小呆
    GRYZY #13. 拼不出的数
    GRYZY- #10. 财富
    GRYZY #8. 公交车
  • 原文地址:https://www.cnblogs.com/boluoboluo/p/6855612.html
Copyright © 2011-2022 走看看