我正在为初学者学习一个在线课程,该课程使用apply/bind方法来设置函数的"this"上下文。
我看到您可以将绑定方法直接链接到功能块,这对我来说是新的。所以这让我想到为什么我不能链接其他方法,而不是绑定/调用/应用,以影响返回的值。
let obj = {
name: 'john',
};
let sayHello = function() {
return 'hello there ' + this.name;
}.apply(obj).toUpperCase();
let sayBonjour = function() {
return 'Bonjour!';
}.toUpperCase();
console.log(sayHello);
console.log(sayBonjour());
在上面的例子中,为什么我可以在使用apply方法的sayHello函数上使用.toUpperCase((方法,而不是在不使用的sayBonjour函数上使用。在尝试这样做时,我收到错误:
'uncatch TypeError: (intermediate value(.toUpperCase not a function'。
我意识到这不是字符串方法(或其他方法(打算使用的方式,出于学习目的,我希望有人可以解释阻止我以这种方式使用该方法的原因。
非常感谢您的时间和帮助
你可以,但你尝试在函数上使用.toUpperCase
。您可以在函数表达式返回的字符串上使用它。您可以使用 IIFE 来实现此目的。
let obj = {
name: 'john',
};
let sayHello = function() {
return 'hello there ' + this.name;
}.apply(obj).toUpperCase();
let sayBonjour = (function() {
return 'Bonjour!';
})().toUpperCase();
console.log(sayHello);
console.log(sayBonjour);
此示例演示了代码被挖掘时发生的情况。
function print(value) {
const str = Object.prototype.toString.apply(value);
console.log("Type: " + str.slice(7, str.length - 1) + "tValue: " + value);
}
let obj = {
name: "john"
};
/*
let sayHello = function() {
return 'hello there ' + this.name;
}.apply(obj).toUpperCase();
*/
// equals to
{
console.log("sayHello case");
let step1 = function () {
return "hello there " + this.name;
};
print(step1);
let step2 = step1.apply(obj);
print(step2);
let sayHello = step2.toUpperCase();
print(sayHello);
}
/*
let sayBonjour = function() {
return 'Bonjour!';
}.toUpperCase();
*/
// equals to
{
console.log("sayBonjour case");
let step1 = function () {
return "Bonjour!";
};
print(step1);
let sayBonjour = step1.toUpperCase();
print(sayBonjour);
}