理解javascript调用函数
运行此代码时,出现以下错误:理解javascript调用函数,javascript,Javascript,运行此代码时,出现以下错误: 'use strict'; let worker = { someMethod() { return 4; }, slow(x) { return x * this.somemethod(); } }; function wrapper(func) { return function(x) { let result = this.func(x); // ** return result; }; } w
'use strict';
let worker = {
someMethod() {
return 4;
},
slow(x) {
return x * this.somemethod();
}
};
function wrapper(func) {
return function(x) {
let result = this.func(x); // **
return result;
};
}
worker.slow = wrapper(worker.slow);
alert( worker.slow(2) );
如果我将**处有问题的行替换为:
TypeError: this.func is not a function
我得到了预期的输出。在这种情况下是8
我想知道为什么它的书写方式是获取“this”的错误方式(即对象工作者)。换句话说,调用函数如何获得正确的对象,即worker?它失败的原因是在有问题的行(以//**突出显示)中,您实际上调用了worker.func(x),它不存在;您根本没有引用传入的变量 如果将函数(func)添加到辅助对象,例如
let result = func.call(this, x);
如上图所示
let worker = {
someMethod: function() {
return 4;
},
slow: function(x) {
return x * this.somemethod();
},
func: function (x) {
return x * 10;
}
};
你会发现它是有效的,尽管这不是你真正想要的 它失败的原因是,在有问题的行中(以//**突出显示),您实际上调用了worker.func(x),而worker.func(x)并不存在;您根本没有引用传入的变量 如果将函数(func)添加到辅助对象,例如
let result = func.call(this, x);
如上图所示
let worker = {
someMethod: function() {
return 4;
},
slow: function(x) {
return x * this.somemethod();
},
func: function (x) {
return x * 10;
}
};
你会发现它是有效的,尽管这不是你真正想要的 在JavaScript中,任何函数调用
obj.f(ArgumentList)
都将被分解为f.call(obj,ArgumentList…)
(请参阅)
当wrapper(worker.slow)
得到一个调用时,函数slow
被传递到包装器中,它生成另一个函数,该函数捕获了func
参数。但是,还没有调用包装器返回的函数
函数调用时发出警报(worker.slow(2))
func
表示在closure
中捕获的参数,func.call(this,x)
表示它将使用当前调用方调用该函数,即worker
worker.slow = wrapper(worker.slow);
console.log( worker.slow(2) );
而此
表示对函数(x){…}
Therefore, `func.call(this,x)` will be `func.call(worker, x) `
which works because `func` exists in the closure.
如果尝试插入console.log(func)
和console.log(this)
在该函数中,您将看到不同之处。在JavaScript中,任何函数调用
obj.f(ArgumentList)
都将被分解为f.call(obj,ArgumentList…)
(请参阅)
当wrapper(worker.slow)
得到一个调用时,函数slow
被传递到包装器中,它生成另一个函数,该函数捕获了func
参数。但是,还没有调用包装器返回的函数
函数调用时发出警报(worker.slow(2))
func
表示在closure
中捕获的参数,func.call(this,x)
表示它将使用当前调用方调用该函数,即worker
worker.slow = wrapper(worker.slow);
console.log( worker.slow(2) );
而此
表示对函数(x){…}
Therefore, `func.call(this,x)` will be `func.call(worker, x) `
which works because `func` exists in the closure.
如果尝试插入console.log(func)
和console.log(this)
在该函数中,您将看到差异。我写了这篇文章,是关于
这个是什么和不是什么,也许这将有助于澄清我写的这篇文章是关于这个是什么和不是什么,也许这将有助于澄清感谢您引入去糖化概念。我以前不知道。标有**的行将被分解为this.func.call(this,x)。根据特里的上述观点,这是无效的。因此我们需要称原始为我们自己。顺便说一句,如果其他人不熟悉desugaring,请阅读以下博客:。这对我帮助很大。谢谢你介绍脱毛的概念。我以前不知道。标有**的行将被分解为this.func.call(this,x)。根据特里的上述观点,这是无效的。因此我们需要称原始为我们自己。顺便说一句,如果其他人不熟悉desugaring,请阅读以下博客:。这对我帮助很大。太好了。非常感谢。杰出的非常感谢。