深入解析bind原理

在解析bind之前我们先看一道题:

function f() {
    console.log(this)
}
let f1 = f.bind(1).bind(2)
f1()

上边的题等同于

let  temp = f.bind(1)
let f1 = temp.bind(2)
f1()
// 首先temp是f.bind(1)的结果,即:
temp = function () {
          f.apply(1)
       }
// 这里改变的是f的this,指向1。
f1 = function () {
    temp.apply(2)
}
// 重点:f1()执行的时候改变的是temp的this,而不是f的this。
// 即f1()的时候是调用temp.apply(2),通过temp.apply(2)再去调用f.apply(2)。
// 所以不论中间有多少层bind,最后那个f调用永远都是最开始的1。

==============================================================================================================
let temp = f.bind(1);
let f1 = temp.bind(2);
let f2 = f1.bind(3);
let f3 = f2.bind(4);
let f4 = f3.bind(5);
f4();

f4() => f3.apply(5) => f2.apply(4) => f1.apply(3) => temp.apply(2)=>f.apply(1)

bind的基本实现原理(参数那个我没有去写了,关注重点)

Function.prototype.bind = function(arg) {
    var _this = this;
    return function () {
        _this.apply(arg)
    }
}

bind的作用是永久改变一个函数执行过程中的this,它的基本实现:
1.bind的执行不会立即执行需要改变this指向的函数;
2.bind执行后返回一个新函数.

知识点:闭包(阻止垃圾回收)
内层函数可以访问外层函数中的变量
内层:return后面的函数
外层:bind函数
因为形成闭包,所以即使bind已经执行完成,但是因为return的函数被外部引用,所以bind中的arg并没有被回收,这样后续无论什么时候调用return出去的函数都能访问到参数arg。

你可能感兴趣的:(深入解析bind原理)