Function.prototype.bind()

  ECMAScript5中新增的方法,但是在ECMAScript3可以通过模仿实现其方法作用

作用:

  bind() 方法会创建一个新函数,当这个新函数被调用时,它的this值是传递给bind()的第一个参数, 它的参数是bind()的其他参数和其原本的参数.

基本语法

fun.bind(thisArg[, arg1[, arg2[, ...]]])

/**
* For a given function, creates a bound function that has the same body as the original function.
* The this object of the bound function is associated with the specified object, and has the specified initial parameters.
* @param thisArg An object to which the this keyword can refer inside the new function.
* @param argArray A list of arguments to be passed to the new function.
*/
bind(thisArg: any, ...argArray: any[]): any;

  参数

  thisArg

    当绑定函数被调用时,该参数会作为原函数运行时的 this 指向。当使用new 操作符调用绑定函数时,该参数无效。

  arg1, arg2, ...

    当绑定函数被调用时,这些参数加上绑定函数本身的参数会按照顺序作为原函数运行时的参数。

   返回值

   返回由指定的this值和初始化参数改造的原函数拷贝

  描述:

  1. bind() 函数会创建一个新函数(称为绑定函数),新函数与被调函数(绑定函数的目标函数)具有相同的函数体。
  2. 目标函数 被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。
  3. 绑定函数被调用时,bind() 也接受预设的参数提供给原函数。
  4. 一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。

  首先要理解几个概念, 绑定函数、 目标函数

  先看看下面的实例:

var  origin = function() {
console.log(this.x, this.y);
}; var o = { x: 1, y: 2 }; var bindFun = origin.bind(o); bindFun();

  origin 目标函数(原函数) bindFun 绑定函数 明白这几个函数所代指的对象。 那么逐一来看看描述上每一句话的含义;

<1> 绑定函数 与 目标函数 具有相同的方法体;

   

var sum = function() {
console.log("12345");
}; var succ = sum.bind();
sum(); //12345
succ(); //12345

从上述打印的结果看出,确实可以验证,它们具有相同的方法体。

<2> 当目标函数被调用时,其 this 会绑定到 bind()函数的第一个参数,该参数不能被重写

  

var sum = function() {
console.log(this.x, this.y);
}; var succ = sum.bind({ x: 1, y: 2 });
succ(); // 1 2

<3> 绑定函数被调用时,bind() 也接受预设的参数提供给原函数

var sum = function(z) {
console.log(this.x, this.y, z);
}; var succ = sum.bind({ x: 1, y: 2 }, 3);
succ(); // 1 2 3

<4> 一个绑定函数也能使用 new 操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。

var sum = function(z) {
console.log(this.x, this.y, z);
}; var succ = sum.bind({ x: 1, y: 2 }, 3);
new succ(); // undefined undefined 3

  如何在ECMAScript3中模拟实现 bind()函数效果

if (!Function.prototype.bind) {
Function.prototype.bind = function(o /*,org*/ ) {
var self = this,
boundArgs = arguments;
return function() {
//创建一个实参列表,将传入 bind() 的第二个及后续的实参都传入这个函数
var args = [],
i;
for (i = 1; i < boundArgs.length; i++) args.push(boundArgs[i]);
for (i = 0; i < arguments.length; i++) args.push(arguments[i]); return self.apply(o, args);
};
};
}

兼容旧的浏览器方式

  bind 函数在 ECMA-262 第五版才被加入;它可能无法在所有浏览器上运行。你可以部份地在脚本开头加入以下代码,就能使它运作,让不支持的浏览器也能使用 bind() 功能。

if (!Function.prototype.bind) {
Function.prototype.bind = function(oThis) {
if (typeof this !== "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, // 保存外部 this
fNOP = function() {}, // 主要用在判断是否为函数实例
fBound = function() {
return fToBind.apply(this instanceof fNOP ? //防止 call apply 方式调用
this :
oThis || this, //从这里可以看出 oThis 是可选的 当没有传递时,默认是当前上下文对象
aArgs.concat(Array.prototype.slice.call(arguments)));
}; fNOP.prototype = this.prototype; // 保持与目标函数一直
fBound.prototype = new fNOP(); // 给绑定函数原型赋值 return fBound;
};
}

JavaScript 函数方法 - bind()的更多相关文章

  1. JavaScript 函数(方法)的封装技巧要领及其重要性

    作为一枚程序猿,想必没有人不知道函数封装吧.在一个完整的项目开发中,我们会在JS代码中对一些常用(多个地方调用)的操作进行一个函数的封装,这样便于我们调试和重复调用,以致于能够在一定程度上减少代码的冗 ...

  2. javascript 函数 方法

    函数 1.函数的定义 (1)function 函数名(x){ 函数执行体; } (2)var 函数名=function(x){ 函数执行体; }; 这种方法说明,在javascript中,函数就是一种 ...

  3. JavaScript 函数方法 - toString()

    Function.prototype.toString() 返回函数代码的字符串形式. 描述 Function 对象覆盖了从 Object 继承来的 Object.prototype.toString ...

  4. javascript中利用柯里化函数实现bind方法

    柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预 ...

  5. 深入理解javascript函数系列第三篇——属性和方法

    × 目录 [1]属性 [2]方法 前面的话 函数是javascript中的特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本 ...

  6. JavaScript中的bind方法及其常见应用

    一.bind()方法的实现 在JavaScript中,方法往往涉及到上下文,也就是this,因此往往不能直接引用.就拿最常见的console.log("info…")来说,避免书写 ...

  7. JavaScript中的bind,call和apply函数的用法和区别

    一直没怎么使用过JavaScript中的bind,call和apply, 今天看到一篇比较好的文章,觉得讲的比较透彻,所以记录和总结如下 首先要理解的第一个概念,JavaScript中函数调用的方式, ...

  8. JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法

    函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...

  9. ASP.NET后台中调用前台Javascript函数的几种方法

    做web开发,用的技术是aspx.net,可是由于比较习惯于ASP现在做起来,觉得非常别扭,原因在于有很多功能其实在前台可以处理的,但是因为用到了很多webcontrol,导致不断postback.如 ...

随机推荐

  1. java 连接sql server2008配置

    Java 应用程序连接SQL Server2008 (Eclipse+JDK7.0+jdbc4.0.jar+Sql Server2008) 假设应用端的连接语句为: String url = &quo ...

  2. 在.NET MVC下不用iframe实现局部加载html

    最近在做个后台系统,之前都是用iframe来实现加载内容,左侧菜单不刷新.但一直不喜欢这种方法,有许多弊端.今天自己在网上查找了一番后找到了比较好的替代方案: 一.利用html的锚点标记来实现无刷新页 ...

  3. ubuntu -server 忘记root 密码方法

    允许 su 到 root 非常简单,只需要重新设置下密码即可.下面是设置的方法: 1 me@ubuntu:~$ sudo passwd 2 密码:<--- 输入安装时那个用户的密码3 输入新的 ...

  4. [vim]插件ctrlp

    ctrlp 这个插件可以快速搜索你的文件或者缓冲区 这样很多时候都不必打开nerdtree了. 直接利用快捷键C-p打开搜索命令.

  5. WebVR

    WebVR 主要面向Web前端工程师,需要一定Javascript及three.js基础:本文主要分享内容为基于three.js开发WebVR思路及碰到的问题:有兴趣的同学,欢迎跟帖讨论. 目录:一. ...

  6. JQuery this和$(this)的区别及获取$(this)子元素对象的方法

    1.JQuery this和$(this)的区别 相信很多刚接触JQuery的人,很多都会对$(this)和this的区别模糊不清,那么这两者有什么区别呢? 首先来看看JQuery中的  $()  这 ...

  7. VMware vSphere 6 Enterprise Plus License

    Product: VMware vSphere 6 Enterprise Plus Licensed for 2 physical CPUs (unlimited cores per CPU) Lic ...

  8. Cypress的开发板的UART接口打印调试信息

    说实话,在官方论坛现在还没有找到相关有用的消息,因为我们这个开发板的UART没引出来. http://www.cypress.com/?app=forum&id=167&rID=527 ...

  9. 【案例】舒邑:一个女装品牌的奇葩打法-@i黑马

    [案例]舒邑:一个女装品牌的奇葩打法-@i黑马 [案例]舒邑:一个女装品牌的奇葩打法

  10. Gwt ListBox选中自动触发事件

    以前用TreeView显示,需求更改 需要做一个ListBox控件显示数据,和HTML中的<Select>标签一样 编辑时候自动触发选中的数据子类: 1.只要自动触发了rootListBo ...