JavaScript中的prototype.bind()方法介绍


Posted in Javascript onApril 04, 2014

以前,你可能会直接设置self=this或者that=this等等,这样做当然也能起作用,但是使用Function.prototype.bind()会更好,看上去也更专业。
下面举个简单的例子:

var myObj = {
    specialFunction: function () {
    },
    anotherSpecialFunction: function () {
    },
    getAsyncData: function (cb) {
        cb();
    },
    render: function () {
        var that = this;
        this.getAsyncData(function () {
            that.specialFunction();
            that.anotherSpecialFunction();
        });
    }
};
myObj.render();

在这个例子中,为了保持myObj上下文,设置了一个变量that=this,这样是可行的,但是没有使用Function.prototype.bind()看着更整洁:
render: function () {
    this.getAsyncData(function () {
        this.specialFunction();
        this.anotherSpecialFunction();
    }.bind(this));
}

在调用.bind()时,它会简单的创建一个新的函数,然后把this传给这个函数。实现.bind()的代码大概是这样的:

Function.prototype.bind = function (scope) {
    var fn = this;
    return function () {
        return fn.apply(scope);
    };
}

 

下面在看一个简单的使用Function.prototype.bind()的例子:

var foo = {
    x: 3
};var bar = function(){
    console.log(this.x);
};
bar(); // undefined
var boundFunc = bar.bind(foo);
boundFunc(); // 3

 

是不是很好用呢!不过遗憾的是IE8及以下的IE浏览器并不支持Function.prototype.bind()。支持的浏览器有Chrome 7+,Firefox 4.0+,IE 9+,Opera 11.60+,Safari 5.1.4+。虽然IE 8/7/6等浏览器不支持,但是Mozilla开发组为老版本的IE浏览器写了一个功能类似的函数,代码如下:

if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      // closest thing possible to the ECMAScript 5 internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP && oThis
                                 ? this
                                 : oThis,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };
    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();
    return fBound;
  };
}
Javascript 相关文章推荐
动态加载iframe
Jun 16 Javascript
JavaScript中的Document文档对象
Jan 16 Javascript
javascript dom 操作详解 js加强
Jul 13 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
Jul 10 Javascript
jQuery实现的Tab滑动选项卡及图片切换(多种效果)小结
Sep 14 Javascript
详解JavaScript基本类型和引用类型
Dec 09 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
Mar 21 Javascript
JS获取input[file]的值并显示在页面的实现方法
Mar 09 Javascript
详解a标签添加onclick事件的几种方式
Mar 29 Javascript
详解js实时获取并显示当前时间的方法
May 10 Javascript
JavaScript实现多文件下载方法解析
Aug 07 Javascript
通过实例解析json与jsonp原理及使用方法
Sep 27 Javascript
jQuery使用ajaxSubmit()提交表单示例
Apr 04 #Javascript
深入理解javascript的执行顺序
Apr 04 #Javascript
iframe窗口高度自适应的又一个巧妙实现思路
Apr 04 #Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
Apr 04 #Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
Apr 04 #Javascript
javascript中的循环语句for语句深入理解
Apr 04 #Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
Apr 04 #Javascript
You might like
用PHP写的MySQL数据库用户认证系统代码
2007/03/22 PHP
php checkbox 取值详细说明
2010/08/19 PHP
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
又一个图片自动缩小的JS代码
2007/03/10 Javascript
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
AnglarJs中的上拉加载实现代码
2018/02/08 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
vue中tab选项卡的实现思路
2018/11/25 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
Vue如何提升首屏加载速度实例解析
2020/06/25 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
老生常谈python中的重载
2018/11/11 Python
django中forms组件的使用与注意
2019/07/08 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
大学生农村教师实习自我鉴定
2013/09/21 职场文书
护士毕业生自荐信
2014/02/07 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
高中语文课后反思
2014/04/27 职场文书
政治表现评语
2014/05/04 职场文书
酒店开业主持词
2015/07/02 职场文书