【问题标题】:can someone explain how this call function works in this method有人能解释一下这个调用函数在这个方法中是如何工作的吗
【发布时间】:2018-04-25 03:32:44
【问题描述】:

在第 31 行 --> https://github.com/benib/aurelia-hammer/blob/master/src/hammer-press.js

this.callback.call(null, { hammerEvent: event });

谁能解释这个hammerEvent 对象是如何映射回调用aurelia 视图模型中的$event 对象的?

【问题讨论】:

  • 你的意思是什么时候消耗属性?
  • 指示的行将包含方法接收的参数 (event) 作为传递给回调的对象的属性转发。视图中的调用表达式指定参数的值

标签: aurelia


【解决方案1】:

谁能解释一下这个hammerEvent对象是如何映射回的 调用 aurelia 视图模型中的 $event 对象?

为了到达那里发生了一些事情。

假设您在视图中使用它,如下所示:

<div hammer-tap.call="handleTap($event)">
</div>
  1. 在编译hammer-tap 属性时,aurelia-templating-binding 将通过一个约定列表到map the binding attributes 到正确的表达式。

  2. 根据您在syntax-interpreter 中看到的.call 的约定,它被转换为CallExpression(位于aurelia-binding

  3. 当编译完成并在组件上调用 bind() 时,此 CallExpression sets a delegate on the target 会调用 callSource 并使用从目标获取的任何值(在您的示例中:{ hammerEvent: event }

现在要完全覆盖这个有点棘手,因为 Aurelia 如何解决所有这些问题的深度和递归性,但是在某处创建了 ListenerExpressioncreateBindingViewFactory 在 @987654338 中调用@ 实质上为相关元素添加了一个事件侦听器。

  1. ListenerExpression 将使用正确的事件调用hammer 的handleSwipe 方法。

我相信在这种特殊情况下实际上不会发生这种情况,因为作者似乎将hammerjsown event handler.on.off 一起使用。所以实际上是 hammerjs 将该事件从常规事件侦听器传递给 handleSwipe

  1. 回到CallExpressioncallSource 最终将调用绑定到.call 的函数,并传入它之前从ListenerExpression(或hammerjs 的处理程序)收到的$event

希望这有点帮助。但正如你所看到的,它非常复杂:)

【讨论】:

  • 谢谢弗雷德!我想我想多了,但你的回答有助于把这些点联系起来。欣赏它
【解决方案2】:

Javascript 提供了三种调用函数的方式

  1. 简单的方法,

假设你有一个函数

function foo() {

}

你只需用括号调用它,比如foo()

  1. 通过使用Function.prototypecall方法

好的,再考虑foo函数

但这一次你需要换一种方式来看待它,javascript中的每个函数也是一个对象,每个对象都有一个原型,然后可以有更多的函数和属性。因此,当您定义像 foo 这样的函数时,它也会成为 Function 的对象,并为您提供两个额外的方法来调用该函数,其中一个是 call,它期望第一个参数是上下文或 this然后以逗号分隔的要传递给函数的参数列表。例如,您有一个用户对象,它具有属性 firstNamelastName,并且您希望拥有可以对该用户说些什么的函数,您可以像这样定义函数

function saySomething(something) {
 return "Hey " + this.firstName + " " + this.lastName} + " I wanted to say " + something
}
  1. 通过使用Function.prototypeapply方法

call 非常相似,不同之处在于您将传递一个数组,而不是用逗号分隔的参数。

更多信息在这里https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function

【讨论】:

  • 这如何回答 OP 关于 HammerEvent 对象如何映射回 Aurelia $event 对象的问题?
【解决方案3】:

在Javascript中可以通过call方法调用函数,原因函数可以是变量。

var p = function(x)
{
    console.log('calling via Call method. arguments: ' + x);
}

现在如果我想调用这个函数,调用它的一种方法是使用如下调用方法。

p.call(null,'test')

更多关于调用函数here的细节。

我认为连接对象和地图是在锤子 js inputHandlercomputeInputData 中完成的

https://hammerjs.github.io/dist/hammer.js

希望有帮助!

【讨论】:

  • 将函数作为变量存储、作为参数传递给函数或从函数返回的能力称为higher-order functions 的语言能力。
  • 我不认为 OP 要求对如何调用 javascript 函数进行一般性解释。
  • 后来才知道……对不起
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 2011-02-16
  • 2013-03-13
  • 1970-01-01
  • 2019-10-24
  • 2023-01-18
  • 2018-10-27
相关资源
最近更新 更多