JavaScript - 使用apply来调用函数,但是'this'没有被设置为作为第一个参数传递的对象

doc*_*rop 5 javascript apply

我正在尝试使用apply方法来调用objectify函数,传递值数组并将其obj用作对象.但是,this没有设置为对象,而是设置为全局环境(window).

这样做的目的是获取一个字符串数组,然后将这些字符串传递给该函数objectify.调用函数时,它接受数组值,拆分它们,如果对象没有带字符串值的属性,则创建该属性.

以下是代码:

let obj = {};
let arr = ["user.name.firstname=John", "user.name.lastname=Smith"];

const objectify = x => {
let cur = this, v;
return x.split('.').forEach(e => /=/g.test(e) ?
(v = e.split('='), cur[v[0]] = v[1]) : cur[e] ?
cur = cur[e] : (cur[e] = {}, cur = cur[e]))};

objectify.apply(obj,arr);
Run Code Online (Sandbox Code Playgroud)

问题是this设置为Window而不是对象obj.我应该如何重写此代码以便将其设置objthis值?

最终结果应该是一个修改过的obj对象,因此它变为:

obj = {user: {name: {firstname: 'John', lastname: 'Smith'}}};
Run Code Online (Sandbox Code Playgroud)

Aln*_*tak 2

发生这种情况(没有双关语)是因为它objectify是一个“箭头函数”,它始终使用this从词法范围继承的 ,并且会忽略任何传递的 via.apply.call

如果您将其重写为普通函数,它应该可以按需要工作。