手写apply、call、bind

这篇具有很好参考价值的文章主要介绍了手写apply、call、bind。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

apply

作用:改变this执行,函数立即执行,参数以数组传递

思路:

        1、在this新指向的对象上,增加一个函数等于待执行函数

        2、去参数

        3、执行函数

        4、删除增加的函数,返回结果

    // apply
    function applyTest() {
        var person = {
            fullName: function (city, country) {
                return this.firstName + " " + this.lastName + "," + city + "," + country;
            }
        }
        var person1 = {
            firstName: "Bill",
            lastName: "Gates"
        }
        console.log(person.fullName.myApply(person1, ["Oslo", "Norway"]));
    }

    // 手写applyTest (参数以数组形式在第二个参数传递, 立即执行)
    Function.prototype.myApply = function (context) {
        if (typeof this !== 'function') {
            conole.error('this is not a function');
        }
        let result = null;
        context = context || window;
        context.fn = this; // 将函数绑定到当前上下文中
        result = context.fn(...arguments[1]); //取得第二个参数(数组)并展开传给函数 
        delete context.fn; // 删除新增的函数
        return result;
    }

call

作用:改变this执行,函数立即执行,参数依次传递

思路:

        1、在this新指向的对象上,增加一个函数等于待执行函数

        2、取参数

        3、执行函数

        4、删除增加的函数,返回结果

    // call
    function callTest() {
        var person = {
            fullName: function (city, country) {
                return this.firstName + " " + this.lastName + "," + city + "," + country;
            }
        }
        var person1 = {
            firstName: "Bill",
            lastName: "Gates"
        }
        console.log(person.fullName.myCall(person1, "Oslo", "Norway"));
    }

    // 手写call (参数依次展开, 立即执行)
    Function.prototype.myCall = function(context) {
        if (typeof this !== 'function') {
            console.error('this is not a function');
        }
        context = context || window;
        let result = null;
        context.fn = this; // 将函数绑定到当前上下文中
        result = context.fn(...[...arguments].slice(1)); //取得第除第一个参数之外的参数并展开传给函数 
        delete context.fn;  // 删除新增的函数
        return result;
    }

bind

作用:改变this执行,返回一个函数,参数依次传递

思路:

        1、指定一个函数等于当前函数

        2、返回一个新函数

        3、函数中使用apply立即执行函数文章来源地址https://www.toymoban.com/news/detail-464249.html

    function bindTest() {
        var person = {
            fullName: function (city, country) {
                return this.firstName + " " + this.lastName + "," + city + "," + country;
            }
        }
        var person1 = {
            firstName: "Bill",
            lastName: "Gates"
        }
        console.log(person.fullName.myBind(person1, "Oslo", "Norway")());
    }    
    // 手写bind (参数依次展开,不立即执行)
    Function.prototype.myBind = function(context) {
        if (typeof this !== 'function') {
            console.error('this is not a function');
        }
        let args = [...arguments].slice(1),
        fn = this;

        return function Fn() {
            return fn.apply(
                this instanceof Fn ? this : context, // 因为返回的函数,防止new执行,所以判断一下,如果是new出来的执行this环境下的,如果不是就是新上下文环境下的
                args.concat(...arguments)
            )
        }

    }

到了这里,关于手写apply、call、bind的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript【History 对象、Cookie 对象 、封装cookie操作、apply、call和bind函数、面向对象简介、new 命令】(十八)

    目录 History 对象 History.back()  History.forward()  History.go() 

    2024年02月12日
    浏览(52)
  • 前端 JS 经典:apply、call、bind

    1. 概念 都是用来改变函数中 this 指向的。区别在于 apply、call 传参方式不一样,调用后,直接执行函数。bind 调用后,返回一个函数体,不直接执行函数。 2. 为什么用 那为什么要改变 this 指向呢。正常情况下,谁调用函数 this 就指向谁。那调用这个函数的那个谁,要访问另一

    2024年02月07日
    浏览(41)
  • (十六)call、apply、bind介绍、区别和实现

    函数中的this指向是在函数被调用的时候确定的,也就是执行上下文被创建时确定的。在一个执行上下文中,this由 调用者 提供,由 调用函数 的方式来决定。 arguments只在函数(除了箭头函数)中存在的类数组参数对象,储存了我们传入的所有参数。 call(this, 参1, 参2, ...) ,第

    2024年04月23日
    浏览(40)
  • js--手写call和apply方法干货注释满满

    我们都知道js中call和apply都是改变this指向的,这篇文章我们一起来实现call和apply的底层吧!我们先来看一下js中的call和apply的用法 一.用法 1.call用法 传递参数逗号分隔 2.apply用法 传递参数为数组 二.手写实现call 1.手写myCall改变this指向 这里this指向已经改变,但是还不可以传递

    2024年02月06日
    浏览(43)
  • 【JavaScript】手撕前端面试题:手写Object.create | 手写Function.call | 手写Function.bind

    🖥️ NodeJS专栏:Node.js从入门到精通 🖥️ 博主的前端之路(源创征文一等奖作品):前端之行,任重道远(来自大三学长的万字自述) 🖥️ TypeScript知识总结:TypeScript从入门到精通(十万字超详细知识点总结) 🧑‍💼个人简介:大三学生,一个不甘平庸的平凡人🍬 👉

    2024年02月21日
    浏览(78)
  • defineProps和立即执行函数不能一起使用的问题

    最近在开发的时候碰到一个很有意思的现象,在一个组件内,我需要定义props,使用方式如下: 本来这里是没有任何问题的,但是问题出在后面的代码里,我们知道Vue3的组合式API生命周期是不存在 created 相关的钩子函数的,如果我们希望在dom实例挂载之前做一些操作,例如请

    2023年04月09日
    浏览(41)
  • 匿名/箭头函数,立即执行函数IIFE;函数声明式和函数表达式

    目录 匿名/箭头函数:简洁 继承上一层作用域链的this 不绑定arguments,用rest参数  rest 参数:...真正的数组 因为没有function声明,所以没有原型prototype,所以不能作为构造函数 当函数体只有一句时,可省 return , {} IIFE:()()(立即调用函数表达式)/自执行匿名函数 函数定义方式

    2024年01月19日
    浏览(38)
  • kotlin的扩展函数“let、run、also、apply”的作用和区别

    Kotlin的扩展函数 let 、 run 、 also 、 apply 都是用于简化代码的工具,它们可以在不修改原始类或对象的情况下添加新的功能和行为。下面是它们的作用和区别: let :用于对一个可空对象进行操作,避免出现空指针异常。它会将对象作为lambda表达式的参数传递,并返回lambda表达

    2024年02月14日
    浏览(44)
  • 17 JavaScript 中的call和apply

    17 JavaScript 中的call和apply 对于咱们逆向工程师而言. 并不需要深入的理解call和apply的本质作用. 只需要知道这玩意执行起来的逻辑顺序是什么即可 在运行时. 正常的js调用: 接下来, 我们可以使用call和apply也完成同样的函数调用 apply和他几乎一模一样. 区别是: apply传递参数要求是

    2024年02月11日
    浏览(36)
  • 【JavaScript】Function的祖传方法call与apply

    看了本文您能了解到的知识! 在本篇文章中,将带你了解 什么是call和apply , call和apply的用途 、如何手写 call 和 apply 以及 call 和 apply 的使用场景。 call() 和 apply() 是 JavaScript 中的两个内置方法,用于调用函数并指定函数中的 this 值。 两者的区别是: call() 方法的语法和作用

    2024年02月17日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包