我并不总是编写 CoffeeScript,但如果我编写,我可能也会使用 jQuery;我总是忘记一些东西的语法。因此,我将在这里全部写下来,以便在记住之前可以参考。
请注意,编译后的示例不包括 CoffeeScript 中自动生成的封闭函数。
安全的 jQuery 封闭函数
这样您就可以安全地使用 $(在 WordPress 中很常见)
(($) ->
) jQuery
(function($) {
})(jQuery);
DOM 就绪
$ ->
console.log("DOM is ready")
$(function() {
return console.log("DOM is ready");
});
调用无参数的方法
$(".submit").click ->
console.log("submitted!")
$(".submit").click(function() {
return console.log("submitted!");
});
调用一个参数的方法
$(".button").on "click", ->
console.log("button clicked!")
$(".button").on("click", function() {
return console.log("button clicked!");
});
调用多个参数的方法
$(document).on "click", ".button2", ->
console.log("delegated button click!")
$(document).on("click", ".button2", function() {
return console.log("delegated button click!");
});
匿名函数中的参数
$(".button").on "click", (event) ->
console.log("button clicked!")
event.preventDefault()
$(".button").on("click", function(event) {
console.log("button clicked!");
return event.preventDefault();
});
返回 False
$(".button").on "click", ->
false
$(".button").on("click", function() {
return false;
});
一个简单的插件
$.fn.extend
makeColor: (options) ->
settings =
option1: "red"
settings = $.extend settings, options
return @each () ->
$(this).css
color: settings.color
$.fn.extend({
makeColor: function(options) {
var settings;
settings = {
option1: "red"
};
settings = $.extend(settings, options);
return this.each(function() {
return $(this).css({
color: settings.color
});
});
}
});
使用插件
$("a").makeColor
color: "green"
$("a").makeColor({
color: "green"
});
Ajax
请注意那里的字符串插值,这也很不错。
$.ajax
url: "some.html"
dataType: "html"
error: (jqXHR, textStatus, errorThrown) ->
$('body').append "AJAX Error: #{textStatus}"
success: (data, textStatus, jqXHR) ->
$('body').append "Successful AJAX call: #{data}"
$.ajax({
url: "some.html",
dataType: "html",
error: function(jqXHR, textStatus, errorThrown) {
return $('body').append("AJAX Error: " + textStatus);
},
success: function(data, textStatus, jqXHR) {
return $('body').append("Successful AJAX call: " + data);
}
});
动画
两种方法。
div.animate {width: 200}, 2000
div.animate
width: 200
height: 200
2000
div.animate({
width: 200
}, 2000);
div.animate({
width: 200,
height: 200
}, 2000);
带回调函数的动画
div.animate
color: red
2000
->
doSomething()
div.animate({
color: red
}, 2000, function() {
return doSomething();
});
链式调用
差别不大。
$("input")
.val("")
.css
'z-index': 5
.removeClass "fart"
$("input").val("").css({
'z-index': 5
}).removeClass("fart");
Promise
虽然这里最后一行被返回了,但实际上并不需要,不过无所谓。
$.when(
$.get("/feature/", (html) ->
globalStore.html = html;
),
$.get("/style.css", (css) ->
globalStore.css = css;
)
).then ->
$("<style />").html(globalStore.css).appendTo("head")
$("body").append(globalStore.html)
$.when($.get("/feature/", function(html) {
return globalStore.html = html;
}), $.get("/style.css", function(css) {
return globalStore.css = css;
})).then(function() {
$("<style />").html(globalStore.css).appendTo("head");
return $("body").append(globalStore.html);
});
使用胖箭头保留 `this`
否则,在 `setTimeout` 内部,您将无法引用按钮。
$(".button").click ->
setTimeout ( =>
$(@).slideUp()
), 500
$(".button").click(function() {
return setTimeout(((function(_this) {
return function() {
return $(_this).slideUp();
};
})(this)), 500);
});
如果您想尝试一下,这里有一个 Pen 中的完整代码。
我很想知道您对 CoffeeScript 与编写 JS 的比较有什么想法。我在 前端设计大会 上听过您关于 SASS 的演讲,以及它必要的抽象。您是否对 CoffeeScript 也有同样的感觉?
我也很好奇这一点。与克服的障碍(设置编译器,学习新的语法)相比,我并没有看到使用 CoffeeScript 优于 JS 的巨大好处。
我同意……
查看 CoffeeScript 和 jQuery 之间的代码差异,我只会看到节省了几个字符……但我也发现 CoffeeScript 难以阅读……
原生 JS 和 jQuery 中的括号有助于(至少对我来说)理解代码并将代码分解成易于理解的部分……
我也没有看到在你的大脑中填充另一种语法并将另一套复杂性添加到你的工作流程中以节省几个按键的好处……
仅是我的个人观点……
我一开始并不相信,但现在使用 Coffeescript 几年了,只要有机会,我就会选择它而不是 Javascript。以下是一些原因
我编写代码的速度更快,并且有更多时间确保代码质量。
有些人抱怨它会让人们成为粗心的 Javascript 编码员。我认为任何语言都无法阻止这种情况。高质量的代码是一种纪律,您可以使用 Coffeescript 以及 Javascript 来实现它。我仍然在 Javascript 中花费大量时间,并且通常会检查生成的输出。
我现在发现缺少大括号是一个好处。缩进更容易看到,并且在许多情况下,我发现语法比 javascript 更易读。
我唯一感到烦恼的是当我切换语言时;我有时会用另一种语言编写代码。但我对其他语言也是这样做的。
设置真的不难。如果你正在预处理 Sass,添加 Coffeescript 只是很小的一步。如果你使用 Grunt 或 Gulp 或 Codekit,几乎不需要任何额外操作。
当然还有更多可以说的,但这些只是一些想法。如果你不尝试 Coffeescript,生活也一样会继续。我认为它值得一试。你永远不知道,你可能会非常喜欢它。
我喜欢将其与 SASS 结合使用,因为它们在外观和缩进语法上非常相似。
我不认为 CoffeeScript 对 JavaScript 的作用像 Sass 对 CSS 的作用那样有用。对于 Sass,它是主要的抽象层。Sass 提供了(通常)需要的基本抽象工具。这些主要的抽象层在 JavaScript 中已经存在(变量、函数等)。
我对 CoffeeScript 总体上没有很强烈的感情。如果你喜欢它并且在使用它时效率很高,那很棒。我永远不会试图从任何人那里夺走它。我偶尔会使用它,因为我认为它很有趣。我确实认为它更适合 JSON 配置,例如 Gruntfile.coffee
$(“input”)
.val “”
.css ‘z-index’: 5
.removeClass “fart”
很棒的文章,已收藏!
我总是使用这个网站 js2coffee.org 来转换我的代码。
胖箭头是一个不错的选择,我通常将我的函数包装在 bind 中以保留 this,但这不太好。另外,console 日志不需要 (),这很方便。Console.log ‘hello world’ 就足够了。
好奇是否有人在用 Coffee 写 jQuery 时使用
$.proxy
(或者只是用胖箭头)。给从 JS 转到 Coffee 的朋友的一点建议:不要忘记隐式返回!我见过一些稍微有点问题的 jQuery 插件,因为返回了错误的东西。请注意,在匿名函数之后传递参数时,不需要括号。
感谢你的文章!
你关于没有参数、一个参数和多个参数的示例实际上比声称的多一个参数:-> 在这些示例中作为参数传递的匿名函数。
对于 Coffeescript,我猜其他语言的偏好可能很重要。如果你习惯使用 PHP 或 Java,那么纯 JavaScript 语法可能会感觉更自然。但如果你经常使用 Python 或 Ruby,Coffeescript 可能更容易上手。
另一种使用更少空格魔法来编写安全的 jQuery 闭包的方法。
几年前我编译过一篇类似的文章 “js vs jq+cs”
出于某种原因,我从未能够融入 CoffeeScript。我知道语法应该很简洁,但它看起来太奇怪了,而且难以阅读。我知道随着时间的推移和经验的积累,你可以适应任何东西,但事实上你需要写一篇博文来帮助你记住语法,这有点令人不安。
如果你要使用 JS 预处理器,我会选择 TypeScript!
你的文章中有一个 OBOE(越界错误)。你的“调用没有参数的方法”有一个参数,“调用一个参数的方法”有两个参数,依此类推……
我不太明白。我想我指的是参数的意思: http://glui.me/?i=2mh6u205x4yer1h/2014-05-14_at_7.24_AM.png/
“click” 是第一个参数。匿名函数是第二个。
啊,是的。好吧,我认为无论如何都很清楚,这就是我的想法。
只是另一种搬起石头砸自己的脚的方式 :-)
为什么不直接记住、学习和使用纯 JavaScript 呢,因为无论如何它都是底层平台?
一直都有“底层平台”。
一个很好的例子……说明 CoffeeScript 如何解决一个不存在的问题!
我玩过 CoffeeScript。一开始它看起来很不错。但是,我永远不会在任何其他开发人员可能需要接触的项目中使用它。
括号是好的!如果你的缩进由于任何原因出现问题,那么 CoffeeScript 似乎就不那么有趣了……
另一个编写漂亮、一致且缩进良好的代码的理由。如果 CoffeeScript 无法编译它,这意味着你的代码编写不正确……
我认为 JCD 在上面说得很对,如果你是一个 Ruby 开发人员,Coffeescript 语法可能更具吸引力。PHP 开发人员可能会喜欢纯 js/jquery 的括号。Haml 也是如此。不过,我不确定为什么 Jade 在 Node/Express 应用中如此普遍。
关于你 promise 代码片段中不需要的返回,你可以在 CoffeeScript 中函数的末尾进行一个普通的返回,例如
.then ->
$(“”).html(globalStore.css).appendTo(“head”)
$(“body”).append(globalStore.html)
return
如你所知,CoffeeScript 通常返回最后一行,但编译器会识别何时没有返回任何内容,并在编译后的 js 中省略隐式返回。
或
null
null
将编译为return null
,而return
将完全省略隐式返回。很棒的文章 Chris,非常有信息量!我个人使用 js2coffee 来转换我的代码。
但是我们为什么要使用 CoffeeScript 呢?
我发现使用 js、jquery 和 coffee 的令人困惑的部分是实现它们的所有变体以及略微不同的语法。加上框架特定的调整(例如 Rails 中的 turbolinks),当你学习所有这些时,很难让它们真正理解。