在什么情况下,我们想使用 apply 呢?
In what cases, we want to use apply with this?
我了解这是如何工作的,但无法理解为什么我们要使用带有“this”关键字的应用,如下例所示:
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args)
} else {
return curried.bind(this, ...args)
}
}
}
这里 bind 和 apply 使用“this”作为第一个参数,但是如果我们可以只做 func(args) 的目的是什么,因为 this 指向一个函数的相同词法环境。我可以通过箭头函数看到它的一些好处,但这里我命名了函数。没有区别还是我遗漏了什么?
使用apply
的原因是为了保持this
的值不变。调用 func(args)
将导致 this
成为 window
对象(在 non-strict 模式下)或 undefined
(在严格模式下)。
这里有一个例子,如果你调用 func(args)
:
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func(args);
} else {
return curried.bind(this, ...args);
}
};
}
const example = {
multiplier: 5,
calculate: function (a, b) {
return (a + b) * this.multiplier;
},
};
example.curriedVersion = curry(example.calculate);
// Because of the way these are being called, `this` should be `example`
console.log(example.calculate(1, 2));
// But here it's not, causing unexpected results
console.log(example.curriedVersion(1)(2));
但如果你这样做,它会起作用 apply(this, args)
:
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return curried.bind(this, ...args);
}
};
}
const example = {
multiplier: 5,
calculate: function (a, b) {
return (a + b) * this.multiplier;
},
};
example.curriedVersion = curry(example.calculate);
// Because of the way these are being called, `this` should be `example`
console.log(example.calculate(1, 2));
console.log(example.curriedVersion(1)(2));
我了解这是如何工作的,但无法理解为什么我们要使用带有“this”关键字的应用,如下例所示:
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args)
} else {
return curried.bind(this, ...args)
}
}
}
这里 bind 和 apply 使用“this”作为第一个参数,但是如果我们可以只做 func(args) 的目的是什么,因为 this 指向一个函数的相同词法环境。我可以通过箭头函数看到它的一些好处,但这里我命名了函数。没有区别还是我遗漏了什么?
使用apply
的原因是为了保持this
的值不变。调用 func(args)
将导致 this
成为 window
对象(在 non-strict 模式下)或 undefined
(在严格模式下)。
这里有一个例子,如果你调用 func(args)
:
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func(args);
} else {
return curried.bind(this, ...args);
}
};
}
const example = {
multiplier: 5,
calculate: function (a, b) {
return (a + b) * this.multiplier;
},
};
example.curriedVersion = curry(example.calculate);
// Because of the way these are being called, `this` should be `example`
console.log(example.calculate(1, 2));
// But here it's not, causing unexpected results
console.log(example.curriedVersion(1)(2));
但如果你这样做,它会起作用 apply(this, args)
:
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return curried.bind(this, ...args);
}
};
}
const example = {
multiplier: 5,
calculate: function (a, b) {
return (a + b) * this.multiplier;
},
};
example.curriedVersion = curry(example.calculate);
// Because of the way these are being called, `this` should be `example`
console.log(example.calculate(1, 2));
console.log(example.curriedVersion(1)(2));