面试必问:call,apply,bind的相同点,以及不同点

125 阅读1分钟

相同点:都可以修改this指向

异同点:1.传参方式不同 call是单个传参,apply是传数组或伪数组

异同点:2.执行方式不同 call和apply是立刻执行函数,apply不会立即执行,而是返回一个修改this的新函数

   /* 
        1. 函数this指向 : 谁‘调用’我,我就指向谁
            1.1 普通函数:  函数名()         this -> window
            1.2 构造函数:  new 函数名()     this -> new创建实例
            1.3 对象方法:  对象名.方法名()   this -> 对象
        2. 默认情况下,函数内部的this是固定的,无法动态修改。 如果想要动态修改函数this指向,需要使用函数上下文调用。
            * 函数上下文 :  函数作用域

        3. 函数上下文调用 : 动态修改this指向
            函数名.call(修改的this,参数1,参数2…………)
            函数名.apply(修改的this, 数组/伪数组 )
            函数名.bind(修改的this)

        */

        let fn = function (a, b) {
            console.log(this)
            console.log(a + b)
        }

        //(1)函数名.call(修改的this,参数1,参数2…………)
        fn.call({name:'张三'},10,20)

        //(2)函数名.apply(修改的this, 数组/伪数组 )
        // apply底层会自动遍历数组,然后按照顺序逐一传参
        fn.apply({name:'李四'},[15,25])

        //(3)函数名.bind(修改的this)
        // bind不会立即执行函数,而是返回一个修改this之后的新函数
        let newFn = fn.bind({name:'王五'})
        newFn(8,9)