摘要:而造成一些莫名其妙的錯(cuò)誤。寫一個(gè)文件打印出編譯命令會(huì)在同級(jí)目錄下生成一個(gè)同名的文件。將包裹在了一個(gè)匿名函數(shù)當(dāng)中,并用調(diào)用,這樣使得代碼隔離,不會(huì)和外部混淆。其中的表示的就是為了方便使用,可以使用雙冒號(hào)來(lái)替代。
很早就知道這CoffeeScript一門語(yǔ)言,但是一直沒(méi)有機(jī)會(huì)系統(tǒng)的學(xué)習(xí)下,那天趁在公司沒(méi)有什么要緊的項(xiàng)目做,就根據(jù)CoffeeScript首頁(yè)的例子學(xué)了一下。
引用CoffeeScript的一段介紹:
CoffeeScript 是一門編譯到 JavaScript 的小巧語(yǔ)言.?在 Java 般笨拙的外表下, JavaScript 其實(shí)有著一顆華麗的心臟. CoffeeScript 嘗試用簡(jiǎn)潔的方式展示 JavaScript 優(yōu)秀的部分. CoffeeScript 的指導(dǎo)原則是:?"她僅僅是 JavaScript". 代碼一一對(duì)應(yīng)地編譯到 JS, 不會(huì)在編譯過(guò)程中進(jìn)行解釋. 已有的 JavaScript 類庫(kù)可以無(wú)縫地和 CoffeeScript 搭配使用, 反之亦然. 編譯后的代碼是可讀的, 且經(jīng)過(guò)美化, 能在所有 JavaScript 環(huán)境中運(yùn)行, 并且應(yīng)該和對(duì)應(yīng)手寫的 JavaScript 一樣快或者更快.---- 來(lái)自CoffeeScript中文
自己是寫PHP的,最開始接觸CoffeeScript的時(shí)候,就被他吸引了,因?yàn)樗谷豢梢圆挥美ㄌ?hào)、分號(hào)就可以識(shí)別語(yǔ)法規(guī)則,在用jQuery編寫一些事件的時(shí)候經(jīng)常會(huì)寫回調(diào)函數(shù),常常在最后留下一大串的 });
使用CoffeeScript就可以寫出很優(yōu)美的Js的代碼了,另外還可以很好的避免局部變量因?yàn)椴患觱ar而引用到全局變量。而造成一些莫名其妙的錯(cuò)誤。
下面是自己的一些筆記:
一、安裝因?yàn)镃offeeScript是基于nodejs的,所以首先需要安裝nodejs?(這家伙也不錯(cuò),居然可以讓js運(yùn)行在服務(wù)端),在nodejs下載相應(yīng)平臺(tái)的版本就可以了,我這里使用CentOS系統(tǒng)。
wget -c http://nodejs.org/dist/v0.10.26/node-v0.10.26.tar.gz tar -zxvf node-v0.10.26.tar.gz -C /usr/local/src/ cd /usr/local/src/ ./configure make && make install
當(dāng)安裝成功了后可以使用
npm -v
測(cè)試是否安裝成功~ ? 如果沒(méi)有該命令看看是不是PATH沒(méi)有加入。
使用npm包管理工具安裝CoffeeScript(為了加快安裝速度,可以使用淘寶NPM鏡像)
安裝CoffeeScript
npm install -g coffee-script
確定安裝成功
coffee -v CoffeeScript Version 1.7.1
?
二、Hello World 2.1編譯一個(gè)第一個(gè)coffeeScript文件coffee命令參數(shù):
-c, --compile | 編譯一個(gè)?.coffee?腳本到一個(gè)同名的?.js?文件. | |
-m, --map | 隨 JavaScript 文件一起生成 source maps. 并且在 JavaScript 里加上?sourceMappingURL?指令. | |
-i, --interactive | 啟動(dòng)一個(gè)交互式的 CoffeeScript 會(huì)話用來(lái)嘗試一些代碼片段. 等同于執(zhí)行coffee?而不加參數(shù). | |
-o, --output [DIR] | 將所有編譯后的 JavaScript 文件寫到指定文件夾. 與?--compile?或?--watch?搭配使用. | |
-j, --join [FILE] | 編譯之前, 按參數(shù)傳入順序連接所有腳本到一起, 編譯后寫到指定的文件. 對(duì)于編譯大型項(xiàng)目有用. | |
-w, --watch | 監(jiān)視文件改變, 任何文件更新時(shí)重新執(zhí)行命令. | |
-p, --print | JavaScript 直接打印到?stdout?而不是寫到一個(gè)文件. | |
-s, --stdio | 將 CoffeeScript 傳遞到 STDIN 后從 STDOUT 獲取 JavaScript. 對(duì)其他語(yǔ)言寫的進(jìn)程有好處. 比如: cat src/cake.coffee | coffee -sc | |
-l, --literate | 將代碼作為 Literate CoffeeScript 解析. 只會(huì)在從?stdio?直接傳入代碼或者處理某些沒(méi)有后綴的文件名需要寫明這點(diǎn). | |
-e, --eval | 直接從命令行編譯和打印一小段 CoffeeScript. 比如: coffee -e "console.log num for num in [10..1]" | |
-b, --bare | 編譯到 JavaScript 時(shí)去掉頂層函數(shù)的包裹. | |
-t, --tokens | 不對(duì) CoffeeScript 進(jìn)行解析, 僅僅進(jìn)行 lex, 打印出 token stream:[IDENTIFIER square] [ASSIGN =] [PARAM_START (]?... | |
-n, --nodes | 不對(duì) CoffeeScript 進(jìn)行編譯, 僅僅 lex 和解析, 打印 parse tree:
--nodejs |
node?命令有一些實(shí)用的參數(shù), 比如 --debug,?--debug-brk,?--max-stack-size, 和?--expose-gc. 用這個(gè)參數(shù)直接把參數(shù)轉(zhuǎn)發(fā)到 Node.js. 重復(fù)使用?--nodejs?來(lái)傳遞多個(gè)參數(shù). |
我習(xí)慣 這么用:coffee -c -w -o ./js hello.coffee 這樣就可以就可以一般編寫一邊編譯,并把編譯后的js文件放到指定的文件夾中。
寫一個(gè)coffee文件:
#打印出Hello World Console.log "Hello World"
編譯命令:
coffee -c hello.coffee
會(huì)在同級(jí)目錄下生成一個(gè)同名的js文件。
可以直接使用node命令執(zhí)行js文件 或者在html中引入讓瀏覽器來(lái)執(zhí)行 ,這里用node直接執(zhí)行:
node hello.js
Hello World!完成 我們看看coff幫我們編譯成了什么樣子的js。
// Generated by CoffeeScript 1.7.1 (function() { console.log("Hello World!"); }).call(this);
CoffeeScript 將js包裹在了一個(gè)匿名函數(shù)當(dāng)中,并用call(this)調(diào)用,這樣使得js代碼隔離,不會(huì)和外部混淆。
?2.2 作用域在js中定義變量需要加上var,但是在CoffeeScript中你不需要這樣做,直接
age=22 name="silenceper" say=(arg)-> console.log "my name is "+arg say name
對(duì)應(yīng)的js如下:
// Generated by CoffeeScript 1.7.1 (function() { var age, name, say; age = 22; name = "silenceper"; say = function(arg) { var str; str = "my name is " + arg; return console.log(str); }; say(name); }).call(this);
可以看到所有的全局變量都會(huì)被定義在最頂層,函數(shù)內(nèi)部的局部變量也被加上var定義,防止和局部變量混淆。這一點(diǎn)非常有用,之前就遇到過(guò)這樣的問(wèn)題,因?yàn)槎x了一個(gè)變量,剛好這個(gè)變量就是dom的id,而我又沒(méi)有加上var聲明,導(dǎo)致ie認(rèn)為這是一個(gè)dom對(duì)象,而出現(xiàn)一些莫名奇妙的錯(cuò)誤,當(dāng)然還有很多,相信寫js的人也遇到過(guò)這樣的問(wèn)題。
2.3 函數(shù)我已經(jīng)在上面使用了函數(shù),它是通過(guò)->的形式來(lái)定義一個(gè)函數(shù),有參數(shù)的話就在前面的括號(hào)中寫參數(shù),然后通過(guò)空格 縮進(jìn)來(lái)表示函數(shù)體。
2.4 ?if/else/unless其實(shí)跟js差不多 ?只不過(guò)使用起來(lái)更加方便了,它不需要你加括號(hào)、分號(hào)來(lái)區(qū)分,這里也是使用空格、縮進(jìn)來(lái)處理。
day="Thursday" if day is "Saturday" or "Sunday" go "rest" else go "work"
coffeeScript跟js中判斷的對(duì)比
還有存在性判斷:就是在變量的后邊加上一個(gè)?
solipsism = true if mind? and not world? speed = 0 speed ?= 15 footprints = yeti ? "bear"2.5 循環(huán)
使用for/in 完成數(shù)組的循環(huán),使用for/of 完成對(duì)象的循環(huán)
for/in示例:
eat food for food in ["toast", "cheese", "wine"]
對(duì)于的js
var _ref,food,_i; _ref = ["toast", "cheese", "wine"]; for (_i = 0, _len = _ref.length; _i < _len; _i++) { food = _ref[_i]; eat(food); }
for/of 示例:
yearsOld = max: 10, ida: 9, tim: 11 ages = for child, age of yearsOld "#{child} is #{age}"
注意:其中的#{}就是變量的替換
2.6 ?switch/when/else使用官方的示例:
?
switch day when "Mon" then go work when "Tue" then go relax when "Thu" then go iceFishing when "Fri", "Sat" if day is bingoDay go bingo go dancing when "Sun" then go church else go work
對(duì)應(yīng)的js:
switch (day) { case "Mon": go(work); break; case "Tue": go(relax); break; case "Thu": go(iceFishing); break; case "Fri": case "Sat": if (day === bingoDay) { go(bingo); go(dancing); } break; case "Sun": go(church); break; default: go(work); }2.7 類/繼承
直接參考官方的示例:
class Animal constructor: (@name) -> move: (meters) -> alert @name + " moved #{meters}m." class Snake extends Animal move: -> alert "Slithering..." super 5 class Horse extends Animal move: -> alert "Galloping..." super 45 sam = new Snake "Sammy the Python" tom = new Horse "Tommy the Palomino" sam.move() tom.move()
對(duì)應(yīng)的js:
var Animal, Horse, Snake, sam, tom, __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; Animal = (function() { function Animal(name) { this.name = name; } Animal.prototype.move = function(meters) { return alert(this.name + (" moved " + meters + "m.")); }; return Animal; })(); Snake = (function(_super) { __extends(Snake, _super); function Snake() { return Snake.__super__.constructor.apply(this, arguments); } Snake.prototype.move = function() { alert("Slithering..."); return Snake.__super__.move.call(this, 5); }; return Snake; })(Animal); Horse = (function(_super) { __extends(Horse, _super); function Horse() { return Horse.__super__.constructor.apply(this, arguments); } Horse.prototype.move = function() { alert("Galloping..."); return Horse.__super__.move.call(this, 45); }; return Horse; })(Animal); sam = new Snake("Sammy the Python"); tom = new Horse("Tommy the Palomino"); sam.move(); tom.move();
其實(shí)在javascript當(dāng)中并沒(méi)有class,extends 這樣的用法,只不過(guò)為了讓使用起來(lái)方便,CoffeeScript允許你這樣簡(jiǎn)單的使用。
通過(guò)觀察編譯后的js發(fā)現(xiàn),它是通過(guò)一個(gè)__extends方法來(lái)實(shí)現(xiàn)繼承這一用法的,其實(shí)也是通過(guò)更改prototype來(lái)實(shí)現(xiàn)。
其中的@name 表示的就是this.name
CoffeeScript為了方便使用prototype,可以使用雙冒號(hào)來(lái)替代prototype。
說(shuō)說(shuō)注釋:
單行注釋:使用一個(gè)#,這種注釋方式不會(huì)被編譯進(jìn)js當(dāng)中
#這是單行注釋
多行注釋:使用三個(gè)#開始,三個(gè)#結(jié)束。這種注釋方式會(huì)被編譯為/**/的形式
### 這是多行注釋 ###
其實(shí)CoffeeScript當(dāng)中還有很多奇妙便捷的功能,你可以在CoffeeScript首頁(yè)的例子中找到。
?
在github中可以找到很多CoffeeScript寫的js項(xiàng)目,可以多看看!
另外還有一個(gè)js轉(zhuǎn)CoffeeScript的工具:https://github.com/js2coffee/js2coffee
原文地址:http://silenceper.com/archives/1108.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78073.html
摘要:當(dāng)你陷在一個(gè)中大型項(xiàng)目中時(shí)應(yīng)用日趨成為常態(tài),沒(méi)有類型約束類型推斷,總有種牽一發(fā)而動(dòng)全身的危機(jī)和束縛??傮w而言,這些付出相對(duì)于代碼的健壯性和可維護(hù)性,都是值得的。目前主流的都為的開發(fā)提供了良好的支持,比如和。參考資料中文文檔 文章博客地址:http://pinggod.com/2016/Typescript/ TypeScript 是 JavaScript 的超集,為 JavaScrip...
摘要:一般來(lái)說(shuō),可以縮短大約的代碼長(zhǎng)度。這就避免了意外創(chuàng)建全局變量。使用表示,不推薦的和將不能使用。因此,使用將是有效的解決方法之一。 簡(jiǎn)單易懂的介紹 CoffeeScript是什么? 首先,它是一門小巧的編程語(yǔ)言。有一本關(guān)于CoffeeScript的指南,寫作The Little Book on CoffeeScript: showImg(https://segmentfault.com/...
摘要:語(yǔ)法校驗(yàn)會(huì)給出警告當(dāng)你仍在使用或不通過(guò)任何關(guān)鍵字聲明變量時(shí)。但是如果腳本中還有其他的普通導(dǎo)出,就會(huì)得到非常奇怪的結(jié)果這個(gè)坑爹的情況目前還沒(méi)有任何好的解決方案。 我在多年前愛(ài)上了coffeScript。對(duì)于javaScript,我一直保持著深沉的愛(ài),也十分高興得看到node.js的快速發(fā)展,但是作為一個(gè)有python背景的程序員,我更喜歡coffeeScript的簡(jiǎn)練語(yǔ)法。 在任何一個(gè)活...
摘要:在自己的博客上分享了十則的一行程序,展示了強(qiáng)大的表達(dá)力。你可以把這個(gè)頁(yè)面發(fā)給你的小伙伴也許還有妹紙,讓他們震驚一下下。它允許你將一個(gè)數(shù)組作為一組參數(shù)傳遞。和均接受可變參數(shù),例如返回。 Ricardo Tomasi在自己的博客上分享了十則CoffeeScript的一行程序,展示了CoffeeScript強(qiáng)大的表達(dá)力。你可以把這個(gè)頁(yè)面發(fā)給你的小伙伴(也許還有妹紙),讓他們震驚一下下。 s...
閱讀 2486·2021-11-22 09:34
閱讀 3097·2021-10-25 09:43
閱讀 2018·2021-10-11 10:59
閱讀 3428·2021-09-22 15:13
閱讀 2364·2021-09-04 16:40
閱讀 448·2019-08-30 15:53
閱讀 3226·2019-08-30 11:13
閱讀 2635·2019-08-29 17:30