03 # 手写 call

简介: 03 # 手写 call

call 干了什么?

  1. 改变 this 指向
  2. 让函数执行
<script>
    function fn(num1, num2) {
        console.log("this----->", this);
        return num1 + num2;
    }
    let obj = {
        name: "kaimo313"
    };
    let res = fn.call(obj, 1, 2);
    console.log("res----->", res);
</script>

手写 call

<script>
    Function.prototype.kaimoCall = function (content) {
        // 没有东西指向 window,将 content 包装成对象
        content = content ? Object(content) : window;
        // 执行 this() 改变不了 this 指向,需要赋值给属性
        content.f = this;
        // 收集参数
        let args = [];
        for (let i = 1; i < arguments.length; i++) {
            args.push(arguments[i]);
        }
        let res = content.f(...args);
        // 再删除多余的 f 参数
        delete content.f;
        return res;
    };
    function fn(num1, num2) {
        console.log("this----->", this);
        return num1 + num2;
    }
    let obj = {
        name: "kaimo313"
    };
    let res = fn.call(obj, 1, 2);
    console.log("res----->", res);
    let res2 = fn.kaimoCall(obj, 1, 2);
    console.log("res2----->", res2);
</script>

629be30db8fc445fbfe6cdc090a038d6.png

目录
相关文章
|
前端开发
手写基础 promise
手写基础 promise
69 0
|
存储 前端开发
|
4月前
|
JavaScript 前端开发 测试技术
手写call , apply , bind 方法的实现
本文通过实例讲解了JavaScript中`call`、`apply`及`bind`方法的用途与实现。以`call`为例,展示了如何改变函数内的`this`指向,并立即执行该函数。通过在`Function.prototype`上定义`myCall`,利用`Symbol`确保新增属性的唯一性,从而避免命名冲突。接着介绍了如何处理不定数量的参数传递,最终实现了自定义的`myCall`方法。随后简述了`apply`与`call`的区别,并展示了其实现方式,主要在于参数传递形式的不同。最后,通过`bind`方法创建了一个返回新函数的例子,该新函数具有固定的`this`上下文,同时支持分批参数传递。
39 2
手写call , apply , bind 方法的实现
|
5月前
|
JavaScript
js【详解】bind()、call()、apply()( 含手写 bind,手写 call,手写 apply )
js【详解】bind()、call()、apply()( 含手写 bind,手写 call,手写 apply )
29 0
|
7月前
|
前端开发 JavaScript API
手写promise
手写promise
44 0
|
7月前
|
索引
07 # 手写 find 方法
07 # 手写 find 方法
60 0
|
JavaScript
JS 手写实现call,apply方法
JS 手写实现call,apply方法
61 0
|
前端开发
前端扫盲202307手写call(2)
前端扫盲202307手写call
63 0
|
前端开发
前端扫盲202307手写call(1)
前端扫盲202307手写call
62 0