Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解javascript调用函数_Javascript - Fatal编程技术网

理解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,请阅读以下博客:。这对我帮助很大。太好了。非常感谢。杰出的非常感谢。