题解 | #_call函数#

_call函数

https://www.nowcoder.com/practice/22df1ed71b204a46b00587fdb780b3ab

我们首先要知道Function中call函数是干什么的:

Function.call()

在JavaScript中,函数的call方法是用于调用函数并且设置函数体内this对象的值。它允许你调用一个函数,指定函数体内this的值,同时可以传入一个参数列表。

语法

function.call(thisArg, arg1, arg2, ...)

参数说明

  • thisArg: 在函数运行时指定的this值。需要注意的是,如果不传递该参数或者传递nullundefinedthis将会被指向全局对象(在浏览器环境下是window对象)。
  • arg1, arg2, ...: 指定的参数列表,这些参数将会作为函数的参数传递进去。

示例

假设有一个对象 person 和一个函数 say

let person = {
  firstName: 'John',
  lastName: 'Doe',
  say: function(greeting) {
    console.log(greeting + ', ' + this.firstName + ' ' + this.lastName);
  }
};

person.say('Hello'); // 输出: Hello, John Doe

现在,如果我们有另外一个对象 person2,我们可以通过call方法借用 personsay 函数,并指定 person2 作为 this 的值:

let person2 = {
  firstName: 'Jane',
  lastName: 'Smith'
};

person.say.call(person2, 'Hi'); // 输出: Hi, Jane Smith

在这个例子中,person.say.call(person2, 'Hi') 调用了 person 对象的 say 方法,但是将 this 指向了 person2,因此输出的结果是 Hi, Jane Smith

应用场景

  • 借用其他对象的方法: 可以通过callapply方法借用其他对象的方法,而不必把方法直接写在每个对象中。
  • 传递参数: 可以在调用函数的同时传递参数,这些参数会作为函数的参数被处理。

总结来说,call方法可以在指定的this值的情况下调用函数,是 JavaScript 中灵活使用函数的一种重要方式。

解题

接下来说一下我们的解题思路。首先判断是否传入了 thisArg(也就是函数执行时的 this 值),如果没有则设为全局对象。其次生成一个唯一的 key 作为 thisArg 的属性名,以避免覆盖已有属性,并且将当前函数(调用 _call 的函数)存储在 thisArg 对象上,键名为 uniqueKey。随后调用函数并传入参数,记得要删除添加的属性(以防止污染 thisArg),最后返回函数调用的结果。

在 JavaScript 中,使用 Symbol() 函数每次调用都会返回一个全局唯一的符号值。因此,不需要使用 new Symbol() 来创建 Symbol 实例,而是直接调用 Symbol() 就可以获取一个新的符号值。

// 填写JavaScript
        Function.prototype._call = function(thisArg,...arg){
            thisArg = thisArg || window

            const uniqueKey = Symbol()
            thisArg[uniqueKey] = this

            const result = thisArg[uniqueKey](...arg)

            delete thisArg[uniqueKey]
            return result
        }

手撕题题库 文章被收录于专栏

这是我开卷的第一步!!

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务