JavaScript自我实现系列(2):call,apply,bind

call, apply, bind

call

使用:

// 1. 定义一个女孩叫x
var x = {
    // 她的身高是170
    height: 170,
    // 她有一双高跟鞋,作用是让她长高10厘米
    highShoes: function(){
        this.height += 10
    }
}
// x穿上高跟鞋
x.highShoes()
// 于是身高变成了180
console.log(x.height) // 180

// 2. 定义一个帅哥叫q
var q = {
    // 他的身高是160,...
    height: 160
}
// q也想增高一下
// q.highShoes() // 但是报错了:Uncaught TypeError: q.highShoes is not a function
// 因为q没有高跟鞋

// 3. q借用x的高跟鞋
x.highShoes.call(q)
// 我也长高啦!
console.log(q.height) // 170

// 这里的this就是指高跟鞋的拥有者,即x女孩
// 如果不通过call改变this的指向,这个高跟鞋的拥有者永远是x
// q通过call借来了x的高跟鞋

所以,call的作用就是:

高跟鞋搬运工

改变this的指向

apply, bind的作用同上。

apply, bind

和call的区别:


// 定义一个主人翁
var x = {}

// 定义一个化妆函数
function makeUp(color, style) {
    // 涂什么颜色的口红
    this.lips = color
    // 留什么样式的发型
    this.hair = style
}

// 用call:
makeUp.call(x, ‘red‘, ‘longHair‘)

// 用apply:
makeUp.apply(x, [‘red‘, ‘longHair‘])

// 用bind:
makeUp.bind(x, ‘red‘, ‘longHair‘)()

第一个参数为null时:

makeUp.call(null, ‘yellow‘, ‘shortHair‘)
// 非严格模式下,第一个参数是null,this指向的window
console.log(window.lips, window.hair) // "yellow", "shortHair"

自我实现

实现一个call函数:

/*
*  call的工作原理就是
*  将一个函数的this指向某个上下文,从而使这个上下文可以调用这个函数。
*
*  函数就像某个工具,
*  call要完成的就是一个借用的过程。
*
*  一曲《借我》送给大家。
*/ 

Function.prototype.lendMe = function (borrower) {
    // 1. 谁借?默认是window借。
    var borrower = borrower || window
    // 2. 借啥?哪个函数调用的lendMe,lendMe的this就是这个函数。
    // 当把这个函数赋值给borrower的方法时,就已经借到了。
    borrower.tool = this
    // 获得传给函数的参数
    var args = [...arguments].slice(1)
    // 3. 借用。前面是借,现在是用。
    var result = borrower.tool(...args)
    // 4. 出来借总是要还的。
    delete borrower.tool
    // 5. 用完的东西给你。
    return result
}

apply和call几乎一样:

Function.prototype.myApply = function (borrower) {
    var borrower = borrower || window
    borrower.tool = this
    // 第二个参数是一个数组
    var arg = arguments[1] || []
    var result = borrower.tool(...arg)
    delete borrower.tool
    return result
}

实现一个bind函数:

/*
*  这里对bind函数的实现,
*  就是利用闭包,返回了一个准备通过apply的方式执行的函数。
*/
Function.prototype.myBind = function (borrower) {
    if(typeof this !== ‘function‘){
        throw new TypeError(‘Error‘)
    }
    var tool = this
    var args = [...arguments].slice(1)
    return function() {
        return tool.apply(borrower, args.concat(...arguments))
    }
}

JavaScript自我实现系列 点击查看

原文地址:https://www.cnblogs.com/best-xiaoqiang/p/10057843.html

时间: 2024-10-10 09:15:16

JavaScript自我实现系列(2):call,apply,bind的相关文章

理解 JavaScript call()/apply()/bind()

理解 JavaScript this 文章中已经比较全面的分析了 this 在 JavaScript 中的指向问题,用一句话来总结就是:this 的指向一定是在执行时决定的,指向被调用函数的对象.当然,上篇文章也指出可以通过 call() / apply() / bind() 这些内置的函数方法来指定 this 的指向,以达到开发者的预期,而这篇文章将进一步来讨论这个问题. 先来回顾一下,举个简单的例子: var leo = { name: 'Leo', sayHi: function() {

JavaScript 之 call apply bind

关键字 this 绑定的方法 this的动态切换,固然为JavaScript创造了巨大的灵活性,但也使得编程变得困难和模糊.有时,需要把this固定下来,避免出现意想不到的情况.JavaScript提供了call.apply.bind这三个方法,来切换/固定this的指向. 1. apply(thisArg[,args]) call(thisArgs [,args...]) 后面跟的是若干个参数列表 而 apply接收的是参数数组. thisArgs指定了函数在运行期的调用者,也就是函数中的th

浅谈javascript中的call、apply、bind

apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念. 先来一个栗子: function fruits() {} fruits.prototype = { color: "red", say: function() { console

javascript中call,apply,bind的用法对比分析

这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们. 关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成"借用“,"请求".想像一下如下的情景:你孤单一人漂泊在外,有急事想往家里打电话,可是很不巧,手机欠费了,或者没电了,或者掉坑里了,总之你的手机就是用

JavaScript学习--Item9 call(),apply(),bind()与回调

1.call(),apply(),bind()方法 JavaScript 中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.简单的说就是改变函数执行的上下文,这是最基本的用法.两个方法基本区别在于传参不同. call(obj,arg1,arg2,arg3); call第一个参数传对象,可以是null.参数以逗号分开进行传值,参数可以是任何类型. apply(obj,[arg1,arg2,arg3]); appl

深入浅出:了解JavaScript中的call,apply,bind的差别

在 javascript之 this 关键字详解文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变性.当在全局作用域时,this指向全局:当在某个对象中使用this时,this指向该对象:当把某个对象的方法赋值给      另外一个对象时,this会指向后一个对象. 3.this的使用场合有:在全局环境中使用:在构造函数中使用,在对象的方法中使用. 4.this的使用注意点,最重要的一点就是要避免多层嵌套使用this对象.

别真以为JavaScript中func.call/apply/bind是万能的!

自从学会call/apply/bind这三个方法后我就各种场合各种使用各种得心应手至今还没踩过什么坑,怎么用?说直白点就是我自己的对象没有某个方法但别人有,我就可以通过call/apply/bind去调用执行别人家的方法,不太懂具体用法的同学可移至MDN学习一下Function.prototype.call() Function.prototype.apply() Function.prototype.bind() ,本文不讲解使用,但是这三个方法并不是万能的,并不一定会执行你想要的那个函数,因

JavaScript中call,apply,bind方法的总结

why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:function(){ console.log(this.user); } } var b = a.fn; b(); //undefined 我们是想打印对象a里面的user却打印出来undefined是怎么回事呢?如果我们直接执行a.fn()是可以的. var a = { user:"追梦子&quo

JavaScript中call,apply,bind方法

why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:function(){ console.log(this.user); } } var b = a.fn; b(); //undefined 我们是想打印对象a里面的user却打印出来undefined是怎么回事呢?如果我们直接执行a.fn()是可以的. var a = { user:"追梦子&quo