【问题标题】:why js can't run method as a function为什么js不能将方法作为函数运行
【发布时间】:2021-07-18 04:52:04
【问题描述】:

javascript

console.log([1, 2].map([1, 2].indexOf));

错误:未捕获的类型错误:Array.prototype.indexOf 在 null 或未定义时调用

但是这行得通

console.log([1, 2].map((x) => [1, 2].indexOf(x)));

在 python 中。

print(list(map([1, 2].index, [1, 2])))

这行得通。

那么为什么第一种方法失败了?

【问题讨论】:

  • 因为如果您只传递对indexOf 的引用,this 上下文就会丢失。
  • 我为这个问题添加了书签,因为具有讽刺意味的是,它帮助我解释了 Python 的一个设计决策(需要明确的 self)。也就是说,语言标签应该用于与您实际尝试修复的代码相关的语言,而不是用于提供参考的其他语言的代码。

标签: javascript methods


【解决方案1】:

indexOf 需要一个数组的 this 值。路过

[1, 2].indexOf

同传递Array.prototype.indexOf:

console.log(
  [1, 2].indexOf === Array.prototype.indexOf
);

类似的:

'use strict';
class Something {
  prop = 'prop';
  method() {
    console.log(this);
  }
}
const s = new Something();
function foo(callback) {
  callback();
}
foo(s.method);

将它作为回调传递而不是调用它通常意味着[1, 2]this 丢失。出于类似的原因,以下内容不会记录数组:

'use strict';
// just for example, don't do this
Array.prototype.foo = function() {
  console.log(this);
}

const arr = [1, 2];
arr.map(arr.foo);

要将this 值传递给.map 以指示回调的调用上下文,您需要传递另一个参数(尽管这非常奇怪):

const arr = [1, 2];
console.log(arr.map(arr.indexOf, arr));

调用indexOf 内联而不是将其作为回调传递通常更有意义。

【讨论】:

  • 那么eta-reduction这里就没有办法了吗?
  • 以前从未见过,但我认为正确的思考方式是,每当调用函数时,this 值是另一个半不可见的参数。给定函数的任何调用,调用的情况也会影响this在其中的内容。
  • @KarlKnechtel 不,目前没有。 a proposal 将使直接传递方法成为可能。有了它,你就可以做到[1, 2].map(::[1, 2].indexOf)。不幸的是,该提案似乎没有太大进展。
  • 啊,我现在想起了这些东西。您还可以使用Array.prototype.indexOf.bind([1,2]) 获得一个可通过的方法。
猜你喜欢
  • 2018-09-19
  • 1970-01-01
  • 2014-05-27
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 2021-09-08
  • 2017-12-19
相关资源
最近更新 更多