【问题标题】:Is it possible to use member functions as callbacks without an anonymous function [duplicate]是否可以在没有匿名函数的情况下将成员函数用作回调[重复]
【发布时间】:2021-09-02 06:30:51
【问题描述】:

如果我想将函数应用于单个对象,我可以这样做:

> 'mystr'.toUpperCase()
'MYSTR'

但如果我想对数组做同样的事情,使用map(例如),我必须这样做:

> ['one','two','three'].map((x)=>x.toUpperCase(x))
[ 'ONE', 'TWO', 'THREE' ]

有没有办法在没有点符号的情况下使用这个函数?例如

// THIS DOESN'T WORK, BUT I WANT TO ACHIEVE SOMETHING LIKE THIS
> String.toUpperCase('mystr')
'MYSTR'
> ['one','two','three'].map(String.toUpperCase)
[ 'ONE', 'TWO', 'THREE' ]

这些只是例子,我不给我使用maptoUpperCase的具体解决方案,拜托。我只想知道成员函数是否可以在没有匿名额外函数的情况下用作回调函数

【问题讨论】:

  • String.toUpperCase 仍然使用点符号...
  • 你的意思是String.prototype.toUpperCase.call("mystr")?或者类似function toUpper(text) { return typeof text === "string" ? text.toUpperCase() : ""; }toUpper("mystr")
  • 是的,对不起。我的意思是你不需要现有的对象来放置点然后应用它。我会尝试改写。

标签: javascript function oop member-functions


【解决方案1】:

不是没有创建另一个函数,不是。无论哪种方式,您最终都会创建一个函数。

但它可以是可重复使用的:

// Reusable function
const makeUpper = str => str.toUpperCase();

// Using it
console.log(["one","two","three"].map(makeUpper));

您也可以使用bind 创建函数,但读起来相当费解:

// Reusable function
const makeUpper = Function.prototype.call.bind(String.prototype.toUpperCase);

// Using it
console.log(["one","two","three"].map(makeUpper));

【讨论】:

  • Function.prototype.call.bind(String.prototype.toUpperCase) 会不会更合适(也不会令人困惑)?或简称$.call.bind("".toUpperCase)
  • @nickzoum - 我不会或多或少地称它为合适的。我不知道这是否会或多或少地使人们感到困惑。 (但肯定不是 $ 版本,这里没有 jQuery。:))我有点像 Function.prototype.call 更好,是的。
  • 我的意思是Function.prototype.call 更合适,$ 部分只是一个简短的选项。很确定所有浏览器都有一个简短的 $ 实现,它只返回找到的第一个元素,而不是完整的列表,但是找不到任何文档。
  • @nickzoum - 仅在控制台中,不在实际代码中。在各种浏览器中试试这个:jsfiddle.net/tjcrowder/ytmdupLn
【解决方案2】:

map 为数组中的每个项目调用您传递的函数,并将当前项目作为第一个参数传递。

toUpperCase 之类的函数不接受任何参数(在您的示例中,您传递了 x 但它被忽略了)。他们期望他们操作的价值是this

所以,不。您不能只传递一个期望thismap 有意义的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 2016-10-13
    • 1970-01-01
    • 2016-07-17
    • 2010-10-04
    • 2015-01-26
    • 2014-09-11
    • 2011-12-15
    相关资源
    最近更新 更多