繁体   English   中英

function(){return fn.apply(me,arguments); 作为回调

[英]function (){ return fn.apply(me, arguments); } as a callback

这个最近开源的Monocle.io源代码https://github.com/maccman/monocle有一些咖啡脚本/ mvc代码,我不明白。 如果我查看Chrome控制台中的源代码(显示JavaScript,而不是coffeescript),则会在类声明之前的每个连接文件的顶部有一个这样的函数。 例如,创建集合的代码的第一部分就是这样

    __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };

  $ = jQuery;

  Events = require('events');

  Collection = (function() {

但是,在coffeeScript中,这个功能

__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };

没有出现。 它只显示代码编译为JavaScript的时间。

问题1.为什么该功能仅出现在已编译的JavaScript中?

继续前进,看起来功能相同

 function (){ return fn.apply(me, arguments); } 

在整个代码中作为回调传递给许多不同的函数。 例如,在Collection类中,它是传递给每个函数的回调。

 each: (callback) =>
    @all().promise.done (records) =>
      callback(rec) for rec in records

它也是在Model类中传递给this observer函数的回调(在应用程序的MVC部分)

observe: (callback) ->
    @on('observe', callback)

我一般了解这个功能是如何工作的

function (){ return fn.apply(me, arguments); } 

它只是意味着函数fnme的上下文中被调用,并且传递给它的任何参数都由arguments表示,但是,我不明白它是如何在这个应用程序中工作的。 当它不在原始coffeescript中时,为什么它在编译好的JavaScript中生成?问题2)是否有一些关于MVC应用程序的东西使它适合作为所有这些不同函数的回调,或者为什么它作为回调传递给所有这些职能?

让我们看一下CoffeeScript的简化示例:

class C
    m: => console.log(@)

这就成了这个JavaScript:

var C,
  __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };

C = (function() {
  function C() {
    this.m = __bind(this.m, this);
  }

  C.prototype.m = function() {
    return console.log(this);
  };

  return C;

})();

有你的__bind 如果我们看看如何使用它,那么事情可能会更清楚:

this.m = __bind(this.m, this);

它出现在C构造函数中,并且用它来替换m方法和__bind返回的函数,所以我们实际上有这个:

var m     = this.m;
var _this = this;
this.m = function() {
    return m.apply(_this, arguments);
};

并且我们看到m方法结束时始终this作为C实例,无论它如何被调用:

c = new C
c.m() # @ (AKA 'this') is `c` inside `m`.
f = c.m
f()   # @ is again `c` inside `f`

演示 (请打开你的控制台)

将其与m: -> console.log(@)行为进行比较:

演示

您可以在这两个演示链接中看到完整生成的JavaScript。

那么这是怎么回事-> vs =>东西? 在CoffeeScript中,使用->=>来定义函数或方法。 区别在于=>生成绑定函数

功能绑定

在JavaScript中, this关键字的动态范围是指当前函数附加到的对象。 如果你将一个函数作为回调或将其连接到不同的对象,原值this将丢失。 [...]

脂肪箭头=>可用于既定义一个函数,并且将其绑定到的当前值this ,右当场。 当使用基于回调的库(如Prototype或jQuery)创建迭代器函数以传递给each或事件处理函数以与bind一起使用时,这很有用。 与脂肪箭头创建的函数能够访问的性能this他们定义在哪里。

请注意文档该部分中回调的讨论。 你看到所有与each有约束力的东西,因为有人想要能够说出这样的话:

something_that_calls_back(obj.each)

并已thisobjeach当它被调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM