在How to Create a Basic Plugin上有一个标题为保护$ Alias和添加范围的部分。
$ variable在JavaScript库中非常流行,如果 你正在使用另一个jQuery库,你将不得不制作jQuery 不要使用$ with jQuery.noConflict()。但是,这会破坏我们的 插件,因为它是在假设$是别名的情况下编写的 jQuery函数。与其他插件一起使用,仍然可以使用 在jQuery $别名中,我们需要将所有代码放在一个 立即调用函数表达式,然后传递函数 jQuery,并将参数命名为$:
在JavaScript中,这个包装器看起来像这样:
(function ( $ ) {
// do stuff
return this;
})(jQuery)
如何将其翻译成CoffeeScript?
答案 0 :(得分:2)
这个coffeescript:
$ = jQuery
### do stuff ###
汇编为:
// Generated by CoffeeScript 1.6.3
(function() {
var $;
$ = jQuery;
/* do stuff*/
}).call(this);
我认为效果是一样的,确保$
指向jQuery
,无论$
在调用环境中是什么。
这是Coffeescript的作者在Writing a jquery plugin in coffeescript - how to get "(function($)" and "(jQuery)"?
中推荐的内容为了更接近原始模式(do
对我来说仍然是一个黑盒子)
do ($=jQuery) ->
### do stuff ###
@
'bare'编译为:
// Generated by CoffeeScript 1.6.3
(function($) {
/* do stuff*/
return this;
})(jQuery);
答案 1 :(得分:1)
起初它并不明显。这是骨架。
$.fn.ourFunction = do ($=jQuery) -> (opts) ->
# do stuff
@
它汇总到这个:
$.fn.ourFunction = (function($) {
return function(opts) {
return this;
};
})(jQuery);
为清晰起见,我们也可以将其分为几行。
$.fn.ourFunction = do ($=jQuery) ->
(opts) ->
# do stuff
@
我们的第一行使用do
语法,该语法最初运行一个函数。我们还可以指定参数(例如$
)及其值(例如jQuery
)。
$.fn.ourFunction = do ($=jQuery) ->
我们的第二行创建了一个返回的函数。请记住,CoffeeScript中的所有内容都是表达式,因此我们不需要说return (opts) ->
(但你可以)。
(opts) ->
然后,我们的代码的主体当然是实际的工作。我从初始代码中遗漏的一个技巧是使用=>
运算符来维护范围。在我们的滚动处理程序中,我们可以强制this
保留我们的目标对象。我们可以调用$('#something').ourFunction()
并在滚动处理程序中有效地调用$('#something').something()
。
$.fn.ourFunction = do ($=jQuery) ->
(opts) ->
$(window).scroll =>
this.something()
@something()
@
我们的最后一行只是@
字符。这允许链接,因为我们正在返回this
。或者,如果我们的最后一行调用this
上的另一个可链接方法,我们就不需要将其显式化。
$.fn.flash = do ($=jQuery) -> (opts) ->
@animate(opacity: 0).delay()
.animate({opacity: 1})