[英]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); }
它只是意味着函数fn
在me
的上下文中被调用,并且传递给它的任何参数都由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)
并已this
来obj
内each
当它被调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.