JavaScript 函数方法 - bind()

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;
    };
}
时间: 2024-08-29 20:24:50

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

javascript 函数 方法

函数 1.函数的定义 (1)function 函数名(x){ 函数执行体; } (2)var 函数名=function(x){ 函数执行体; }; 这种方法说明,在javascript中,函数就是一种对象,也就是说,函数也是一种数据类型,参数列表相当于函数的入口,return相当于函数的出口. 如:var abs = function (x) { if (x >= 0) { return x; } else { return -x; } }; function (x) { ... }是一个匿名函

JavaScript 函数方法 - toString()

Function.prototype.toString() 返回函数代码的字符串形式. 描述 Function 对象覆盖了从 Object 继承来的 Object.prototype.toString 方法.函数的 toString 方法会返回一个表示函数源代码的字符串.具体来说,包括 function关键字,形参列表,大括号,以及函数体中的内容. 案例: 一般情况下,函数在需要字符串形式情况下会自动调用toString()方法 function autoFormat(){ console.lo

编写javascript的方法实现的一些功能。

编写一个javascript函数方法parseQueryString,把url参数解析为一个对象 var url="http://www.taobao.com/index.php?key0=0&key1=1&key2=2"; function parseQueryString(){ var str=url.split("?")[1]; var items=str.split("&"); var result={}; var

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

柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预先存储的值进行相关的操作处理即可: 柯里化函数主要起到预处理的作用: bind方法的作用:把传递进来的callback回调方法中的this预先处理为上下文context; /** * bind方法实现原理1 * @param callback [Function] 回调函数 * @param con

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

一直没怎么使用过JavaScript中的bind,call和apply, 今天看到一篇比较好的文章,觉得讲的比较透彻,所以记录和总结如下 首先要理解的第一个概念,JavaScript中函数调用的方式,总结下来,有以下4种 1. 方法调用 2. 正常函数调用 3. 构造器函数调用 4. apply/call 调用 要明白的第2个概念, JavaScript 中的函数,无论是上面哪种函数调用方式,除了你函数声明时定义的形参外,还会自动给函数添加两个形参,分别是this 和 arguments 要明白

JavaScript 函数定义方法

JavaScript 函数定义方法. 函数声明 在之前的教程中,你已经了解了函数声明的语法 : function functionName(parameters) { 执行的代码 } 函数声明后不会立即执行,会在我们需要的时候调用到. function myFunction(a, b) { return a * b; } 分号是用来分隔可执行JavaScript语句. 由于函数声明不是一个可执行语句,所以不以分号结束. 函数表达式 JavaScript 函数可以通过一个表达式定义. 函数表达式可

JavaScript函数内部属性和函数方法

函数是对象,有自己的属性和方法 .首先通过console下输出的函数属性方法来直观的看一下: 函数内部属性只要包括两个特殊的对象:arguments和this. 函数属性包括:length和prototype 函数方法(非继承)包括:apply()和call() 继承而来的函数方法:bind().toString().toLocaleString().valueOf() 其他的目前不熟,后面再补充 1. 函数内部属性 在函数内部,有两个特殊的对象,arguments和this. argument

iframe子页面调用父页面javascript函数的方法(支持chrome和IE的通用方法)

iframe子页面调用父页面javascript函数的方法 今天遇到一个iframe子页面调用父页面js函数的需求,解决起来很简单,但是在chrome浏览器遇到一点小问题.顺便写一下iframe的父页面调用子页面javascript函数的方法吧,备用! 1.iframe子页面调用 父页面js函数 子页面调用父页面函数只需要写上window.praent就可以了.比如调用a()函数,就写成: window.praent.a(); 但是我在chrome浏览器下却发现此方法无效了!查了半天才了解,在c

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

函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留言告诉我, 谢谢).因为调用对象是作用域链的一部分,所以在函数体内可以把这个对象属性作为变量来访问. 调用对象的属性包括:用var声明的局部变量,函数形参,还有一种特殊的属性arguments 函数的实际参数:实际参数对象 arguments对象,用来引用实际参数对象.函数的arguments对象并