题解 | #_call函数#
_call函数
https://www.nowcoder.com/practice/22df1ed71b204a46b00587fdb780b3ab
我们首先要知道Function中call函数是干什么的:
Function.call()
在JavaScript中,函数的call
方法是用于调用函数并且设置函数体内this
对象的值。它允许你调用一个函数,指定函数体内this
的值,同时可以传入一个参数列表。
语法
function.call(thisArg, arg1, arg2, ...)
参数说明
thisArg
: 在函数运行时指定的this
值。需要注意的是,如果不传递该参数或者传递null
或undefined
,this
将会被指向全局对象(在浏览器环境下是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
方法借用 person
的 say
函数,并指定 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
。
应用场景
- 借用其他对象的方法: 可以通过
call
或apply
方法借用其他对象的方法,而不必把方法直接写在每个对象中。 - 传递参数: 可以在调用函数的同时传递参数,这些参数会作为函数的参数被处理。
总结来说,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 }
这是我开卷的第一步!!