讀<了不起的Node.js>-05.node中的JavaScript

node中的JavaScript

  • 在nodejs中寫(xiě)js和在瀏覽器中不同,node除了提供和瀏覽器一樣的基本語(yǔ)言外,還在語(yǔ)言基礎(chǔ)上提供了構(gòu)建強(qiáng)大網(wǎng)絡(luò)應(yīng)用所需的API

global對(duì)象

  • 在瀏覽器中,全局對(duì)象指的就是window對(duì)象,在window對(duì)象上定義的任何內(nèi)容都可以被全局訪問(wèn)到,比如,setTimeout其實(shí)就是window.setTimeout,document其實(shí)就是window.document
  • 在node中有兩個(gè)類似但是給子代表著和不同含義的對(duì)象,
  • global: 和window一樣,任何global對(duì)象上的屬性都可以被全局訪問(wèn)到

  • process:所有全局執(zhí)行上下穩(wěn)重的內(nèi)容都在process對(duì)象中,在瀏覽器中,只有一個(gè)window對(duì)象,在node中,也只有一個(gè)process對(duì)象,舉例來(lái)說(shuō),在瀏覽器中窗口的名字是 window.name ,類似的 在node 中 進(jìn)程的名字是 process.title

實(shí)用的全局對(duì)象

  • 瀏覽器中有一些函數(shù)和工具并非是語(yǔ)言標(biāo)準(zhǔn)被的一部分,但瀏覽器卻仍將其視作重要的特性來(lái)實(shí)現(xiàn),例如setTimeout,事實(shí)上該函數(shù)是無(wú)法通過(guò)純js重寫(xiě)
  • 在node中為了提高小路就加進(jìn)來(lái)了,setImmediate API就是一個(gè)例子,在node中它的作用和process.nextTick相當(dāng)
console.log(1);
process.nextTick(function () {
    console.log(3);
});
console.log(2);
setTimeout(function () {
    console.log(4);
}, 1000);
  • 把它想象成setTimeout(fn,1) 或者"通過(guò)異步的方式在最近的將來(lái)調(diào)用函數(shù)",
  • 還有一個(gè)例子是console,console 最早由firefox中輔助開(kāi)發(fā)的插件 firebug實(shí)現(xiàn),現(xiàn)在node也引入了一個(gè)console對(duì)象,該對(duì)象用來(lái)輸出打印
  • console.log和 console.errot

模塊系統(tǒng)

  • node內(nèi)置了很多模塊 例如 http ,net,fs
  • 引入了一些核心模塊 require module exports

絕對(duì)和相對(duì)模塊

  • 這里絕對(duì)模塊指的是node通過(guò)其內(nèi)部的 node_modules 或者node內(nèi)置的如fs
  • 相對(duì)模塊指的是require調(diào)用的指向相對(duì)工作目錄中得 JavaScript文件

暴露API

  • 相對(duì)模塊得通過(guò)modules exprots導(dǎo)出文件接口 主文件那邊用require來(lái)調(diào)用

事件

  • nodejs的基礎(chǔ)api之一就是EventEmitter 無(wú)論在node還是瀏覽器中,大量代碼都依賴于所監(jiān)聽(tīng)或者分發(fā)的事件
  • window.addEventListerner('load',function () { alert('試試');};
  • 瀏覽器中負(fù)責(zé)處理事件相關(guān)的DOM API主要包括addeventlistener,removeeventlistener以及dispatchevent
  • 下面發(fā)起一個(gè)ajax 瀏覽器中
var ajax = new XMLHttpRequest;
ajax.addEventListener('stateChange', function () {
    if (ajax.readyState == 4 && ajax.responseText) {
        alert('獲取一些數(shù)據(jù)' + ajax.responseText);
    }
});

ajax.open('GET', '/my-page');
ajax.send(null);

  • 用node發(fā)起一個(gè)異步請(qǐng)求,一個(gè)回調(diào)函數(shù)
let http = require('http');

http.Server(function (req, res) {
    let buf = "";
    req.on('data', function (data) {
        buf += data;
    });
    req.on('end', function () {
        console.log("數(shù)據(jù)接收完畢");
    });
}).listen(3000);

  • 這是node中常見(jiàn)的例子: 將請(qǐng)求數(shù)據(jù)內(nèi)容進(jìn)行緩沖(data事件),等到所有的數(shù)據(jù)都接收完畢(end事件)再對(duì)事件進(jìn)行處理
  • 不論某個(gè)事件在將來(lái)被觸發(fā)了多少次,我都希望只調(diào)用一次回調(diào)函數(shù),這類需求提供了一個(gè)名字簡(jiǎn)潔的方式
a.once('某個(gè)事件',function(){
    //無(wú)論觸發(fā)多少次 該方法只執(zhí)行一次
})
  • API手冊(cè)很重要 學(xué)的時(shí)候記得多看

buffer

  • 除了模塊以外 node還彌補(bǔ)了語(yǔ)言另外一個(gè)不足之處,對(duì)于二進(jìn)制數(shù)據(jù)的處理
  • buffer是一個(gè)表示固定內(nèi)存分配的全局對(duì)象(也就是說(shuō),要放到緩沖區(qū)中得字節(jié)數(shù)需要提前定下),他就好比一個(gè)由八位字節(jié)元素組成的數(shù)組,可以有效的在JavaScript中表示二進(jìn)制數(shù)據(jù)
  • 該功能可以對(duì)數(shù)據(jù)進(jìn)行編碼轉(zhuǎn)換,例如可以創(chuàng)建一副用base64表示的圖片,然后將其作為二進(jìn)制png形式寫(xiě)入文件
let mybuffer = new Buffer('==ii1j2i3h1i23h','base64');
console.log(mybuffer);
require('fs').writeFile('log.opng',mybuffer)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子焕檬,更是在濱河造成了極大的恐慌唠帝,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件性湿,死亡現(xiàn)場(chǎng)離奇詭異来累,居然都是意外死亡砚作,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)嘹锁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)葫录,“玉大人,你說(shuō)我怎么就攤上這事领猾∶淄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵摔竿,是天一觀的道長(zhǎng)面粮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)继低,這世上最難降的妖魔是什么熬苍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮袁翁,結(jié)果婚禮上柴底,老公的妹妹穿的比我還像新娘。我一直安慰自己粱胜,他們只是感情好柄驻,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著焙压,像睡著了一般鸿脓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涯曲,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天野哭,我揣著相機(jī)與錄音,去河邊找鬼幻件。 笑死虐拓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的傲武。 我是一名探鬼主播蓉驹,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼揪利!你這毒婦竟也來(lái)了态兴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疟位,失蹤者是張志新(化名)和其女友劉穎瞻润,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绍撞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年正勒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傻铣。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡章贞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出非洲,到底是詐尸還是另有隱情鸭限,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布两踏,位于F島的核電站败京,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梦染。R本人自食惡果不足惜赡麦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帕识。 院中可真熱鬧泛粹,春花似錦、人聲如沸渡冻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)族吻。三九已至,卻和暖如春珠增,著一層夾襖步出監(jiān)牢的瞬間超歌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蒂教, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巍举,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓凝垛,卻偏偏與公主長(zhǎng)得像懊悯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梦皮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,223評(píng)論 0 3
  • Node.js是目前非程糠郑火熱的技術(shù),但是它的誕生經(jīng)歷卻很奇特剑肯。 眾所周知捧毛,在Netscape設(shè)計(jì)出JavaScri...
    w_zhuan閱讀 3,617評(píng)論 2 41
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,088評(píng)論 0 1
  • 面試題一:https://github.com/jimuyouyou/node-interview-questio...
    R_X閱讀 1,625評(píng)論 0 5
  • 星期日 由于權(quán)姐暈倒,大家決定周日休息 之前說(shuō)好的,要去送你的呀忧,可是早上的時(shí)候真的好不想起啊师痕,但是反復(fù)掙扎,還是決...
    Lucky黑girl閱讀 219評(píng)論 0 0