国产精品美女久久久浪潮AV,国产精品三级一二三区,久久精品国产一区二区小说 ,依依成人影视国产精品,全部无卡免费的毛片在线看,日本一区二区三深夜不卡,国产精品女同一区二区久久,国产精品夜色一区二区三区

        Node.js新手必須知道的4個(gè)JavaScript概念

        如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中,?請(qǐng)點(diǎn)這里 

         

        如果只需要知道一種編程語(yǔ)言就可以構(gòu)建一個(gè)全棧的應(yīng)用程序,是不是特別了不起?Ryan Dahl為了把這個(gè)想法成為現(xiàn)實(shí),創(chuàng)造了node.js。Node.js是建立在Chrome強(qiáng)勁的V8 JavaScript引擎上的服務(wù)器端框架。雖然最初是用C++編寫(xiě)的,但是應(yīng)用程序通過(guò)JavaScript運(yùn)行。

        這樣一來(lái),問(wèn)題就解決了。一種語(yǔ)言就可以統(tǒng)治一切。而且,在整個(gè)應(yīng)用程序中你只需要使用這一種語(yǔ)言。所以,我們需要深刻了解node.js。這就是本文的主題。

        下面這四個(gè)基本概念是你想要掌握node.js所必需的。我會(huì)盡可能長(zhǎng)話短說(shuō)向大家介紹它們。

        logo-nodejs.jpg

         

        1.非阻塞或異步I/O

        由于Node.js是一種服務(wù)器端框架,所以它的一個(gè)主要工作就是處理瀏覽器請(qǐng)求。在傳統(tǒng)的I/O系統(tǒng)中,當(dāng)前請(qǐng)求只有當(dāng)先前請(qǐng)求的響應(yīng)(HTML頁(yè)面)已到達(dá)才會(huì)發(fā)出。這就是為什么它被稱(chēng)為阻塞I/O。服務(wù)器阻塞其他請(qǐng)求是為了處理當(dāng)前的請(qǐng)求,而這會(huì)導(dǎo)致瀏覽器的等待。

        Node.js不遵循I/O的這個(gè)原則。如果一個(gè)請(qǐng)求需要花費(fèi)較長(zhǎng)時(shí)間,那么Node.js會(huì)發(fā)送請(qǐng)求到事件循環(huán)(event loop)中,并繼續(xù)在調(diào)用棧(call stack)中處理下一個(gè)請(qǐng)求。一旦未決請(qǐng)求完成處理,它就會(huì)告訴Node.js,并將響應(yīng)渲染在瀏覽器上。

        用一個(gè)虛擬的例子來(lái)理解這一點(diǎn):

        阻塞I / O

        // take order for table 1 and wait...
        var order1 = orderBlocking(['Coke', 'Iced Tea']); // once order is ready, take order back to table.
        serveOrder(order1); // once order is delivered, move on to another table. // take order for table 2 and wait...
        var order2 = orderBlocking(['Coke', 'Water']); // once order is ready, take order back to table.
        serveOrder(order2); // once order is delivered, move on to another table. // take order for table 3 and wait...
        var order3 = orderBlocking(['Iced Tea', 'Water']); // once order is ready, take order back to table.
        serveOrder(order3); // once order is delivered, move on to another table.

        在這個(gè)餐廳例子中,服務(wù)員給出菜單,等待訂單完成,然后再回到餐桌根據(jù)菜單上菜。在當(dāng)前客戶(hù)點(diǎn)菜時(shí),服務(wù)員就在旁邊等待,不接受其他客戶(hù)的菜單。

        非阻塞I / O

        // take order for table 1 and move on... orderNonBlocking(['Coke', 'Iced Tea'], function(drinks){ return serveOrder(drinks);
        }); // take order for table 2 and move on... orderNonBlocking(['Beer', 'Whiskey'], function(drinks){ return serveOrder(drinks);
        }); // take order for table 3 and move on... orderNonBlocking(['Hamburger', 'Pizza'], function(food){ return serveOrder(food);
        });

        在這個(gè)例子中,服務(wù)員獲得菜單,并告知廚師,然后返回取另一份菜單。在完成第一個(gè)菜單進(jìn)程中,他既按照順序給當(dāng)前顧客上菜,也接受來(lái)自其他客戶(hù)的點(diǎn)單。服務(wù)員不會(huì)因?yàn)樽枞麃?lái)自于其他客戶(hù)的點(diǎn)菜而浪費(fèi)時(shí)間。

        2.原型

        原型是JavaScript的一個(gè)復(fù)雜概念。不過(guò)因?yàn)樵贜ode.js中你要多次用到原型,所以每個(gè)JavaScript開(kāi)發(fā)人員都必須了解這個(gè)概念。

        在實(shí)現(xiàn)經(jīng)典繼承的語(yǔ)言中,例如Java,或C ++,對(duì)于以代碼重用為目的的語(yǔ)言,你首先必須寫(xiě)一個(gè)類(lèi),然后從該類(lèi)創(chuàng)建對(duì)象或擴(kuò)展該類(lèi)。但是,在JavaScript中不存在類(lèi)的概念。首先在JavaScript中創(chuàng)建一個(gè)對(duì)象,然后從這個(gè)對(duì)象中增加自己的對(duì)象,或創(chuàng)建新的對(duì)象。這就是所謂的原型傳承和通過(guò)原型的實(shí)現(xiàn)。

        每個(gè)JavaScript對(duì)象被鏈接到一個(gè)來(lái)自于它可以繼承屬性的原型對(duì)象。原型類(lèi)似其他OO語(yǔ)言中的類(lèi),但不同的是,它們本身也是對(duì)象。每一個(gè)對(duì)象都鏈接到Object.prototype,而Object.prototype自帶JavaScript預(yù)定義。

        如果你通過(guò)obj.propName或 obj['propName'] 查找屬性,而對(duì)象并不具有可通過(guò) obj.hasOwnProperty(‘propName’)被檢查的屬性,那么JavaScript的運(yùn)行時(shí)會(huì)在其原型對(duì)象中查找屬性。如果原型對(duì)象也沒(méi)有這樣的屬性,那么依次檢查它的原型,直到找到匹配,或者到達(dá)Object.prototype。如果該屬性不存在原型鏈,那么它會(huì)導(dǎo)致一個(gè)未定義的值。

        通過(guò)下面的示例代碼來(lái)理解這個(gè)概念:

        if (typeof Object.create !== 'function') { Object.create = function (o) { var F = function () {};
                F.prototype = o; return new F();
            }; var otherPerson = Object.create(person);

        當(dāng)你創(chuàng)建一個(gè)新對(duì)象的時(shí)候,你必須選擇一個(gè)應(yīng)該是它的原型的對(duì)象。這里,我們添加了一個(gè)方法到Object  function。該方法創(chuàng)建了一個(gè)使用另一個(gè)對(duì)象作為其原型的新對(duì)象,而原型作為參數(shù)傳遞給它。

        當(dāng)我們改變新對(duì)象的時(shí)候,它的原型不受影響。但是,當(dāng)我們進(jìn)行改變?cè)蛯?duì)象的時(shí)候,這些變化在所有基于該原型的對(duì)象上可見(jiàn)。

        原型是一個(gè)復(fù)雜的概念。我將在另一篇文章中詳細(xì)說(shuō)明。

        3.模塊

        如果你曾經(jīng)接觸過(guò)Java中的包,那么Node.js中的模塊也沒(méi)有什么不同。如果沒(méi)有,那么也不用擔(dān)心。模塊是包含特定目的代碼的簡(jiǎn)單的JavaScript文件。模塊模式用來(lái)使你的代碼易于導(dǎo)航和使用。要使用模塊屬性,你需要在JavaScript文件中需求它,很像在Java類(lèi)中導(dǎo)入包。

        node.js中有兩種類(lèi)型的模塊。

        核心模塊——這些模塊是用Node.js庫(kù)預(yù)編譯過(guò)的。核心模塊的目的是提供開(kāi)發(fā)者經(jīng)常發(fā)生和重復(fù)的代碼段,這些代碼段如果不可用的話,會(huì)導(dǎo)致開(kāi)發(fā)者陷入不得不一次又一次地寫(xiě)相同代碼的處境。一些常見(jiàn)的核心模塊是HTTP,URL,EVENTS,F(xiàn)ILE SYSTEM,等等。

        用戶(hù)定義模塊——用戶(hù)定義模塊是開(kāi)發(fā)人員在應(yīng)用程序內(nèi)創(chuàng)建用于特定目的的模塊。當(dāng)核心模塊不能滿(mǎn)足期望功能的時(shí)候就需要用戶(hù)定義模塊。

        模塊通過(guò)require函數(shù)提取。如果它是一個(gè)核心模塊,那么參數(shù)僅僅是模塊的名稱(chēng)。如果它是一個(gè)用戶(hù)自定義模塊,那么參數(shù)就是該模塊在文件系統(tǒng)中的路徑。例如:

        // extract a core module like this var http = require('http); // extract a user defined module like this var something = require('./folder1/folder2/folder3/something.js');

        4.回調(diào)函數(shù)

        在JavaScript中,函數(shù)被認(rèn)為是第一類(lèi)對(duì)象。這意味著你可以對(duì)這些函數(shù)做所有可對(duì)常規(guī)對(duì)象做的操作。你可以賦值函數(shù)給變量,作為參數(shù)傳遞函數(shù)給方法,作為對(duì)象屬性聲明函數(shù),甚至從函數(shù)返回函數(shù)。

        回調(diào)函數(shù)是JavaScript中的匿名函數(shù),它可以作為參數(shù)傳遞給其他函數(shù),要么被執(zhí)行或返回自函數(shù)稍后執(zhí)行。這是回調(diào)函數(shù)——這個(gè)使用最廣的函數(shù)編程范式的基礎(chǔ)。

        當(dāng)我們將回調(diào)函數(shù)作為參數(shù)傳遞給另一個(gè)函數(shù)的時(shí)候,我們只能傳遞函數(shù)定義……換言之就是,我們不知道這個(gè)回調(diào)函數(shù)什么時(shí)候會(huì)執(zhí)行。這完全取決于調(diào)用函數(shù)的機(jī)制。它會(huì)在以后的某個(gè)時(shí)間點(diǎn)“回調(diào)”,因此而得名。這也是非阻塞或Node.js異步行為的唯一基礎(chǔ),如下例所示。

        setTimeout(function() { console.log("world");
        }, 2000) console.log("hello");

        這是回調(diào)函數(shù)最簡(jiǎn)單的例子之一。我們將一個(gè)匿名函數(shù)作為一個(gè)參數(shù)傳遞,這個(gè)參數(shù)只需在控制臺(tái)上記錄一些輸出到setTimeout函數(shù)。它是唯一的函數(shù)定義,但是不知道何時(shí)執(zhí)行。這需要經(jīng)過(guò)2秒后,通過(guò)第二個(gè)參數(shù),調(diào)用setTimeout函數(shù)來(lái)決定。

        首先,第二個(gè)日志語(yǔ)句記錄輸出到控制臺(tái),然后,2秒鐘后,回調(diào)函數(shù)中的日志語(yǔ)句記錄輸出。

        // output hello
        world

        上面這些就是Node.js新手必須知道的4個(gè)最重要的 JavaScript概念。你的看法呢?希望大家能夠暢所欲言!

         

        藍(lán)藍(lán)設(shè)計(jì)m.shtzxx.cn?)是一家專(zhuān)注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)BS界面設(shè)計(jì)? cs界面設(shè)計(jì)? ipad界面設(shè)計(jì)? 包裝設(shè)計(jì)? 圖標(biāo)定制? 用戶(hù)體驗(yàn) 、交互設(shè)計(jì)、?網(wǎng)站建設(shè)?平面設(shè)計(jì)服務(wù) 

         

        日歷

        鏈接

        個(gè)人資料

        存檔

        主站蜘蛛池模板: 新版天堂在线| 中文字幕乱码一区二区免费| 精品日韩亚洲av无码| 中文字幕视频在线看| 国产免费午夜a无码v视频| 宝贝腿开大点我添添公视频免| 蜜桃成熟时快播| 国产毛多水多高潮高清| 国产一区二区三区无码免费| 18+内射| 免费乱理伦片在线观看| 欧美变态另类z0z0禽交| 欧美性受xxxx黑人xxxx| 国产美女亚洲精品久久久毛片| 久久久一本精品99久久精品36| 熟女人妻高清一区二区三区| 色一情一乱一伦一区二区三区日本| 欧美另类亚洲中文字幕| 国产精品毛片久久久久久久| 色偷偷av亚洲男人的天堂| 日本熟妇大屁股人妻| 被三个室友狂躁到早上男男| 欧美人与zoxxxx另类| 玩丰满熟妇xxxx视频| 亚洲综合伊人久久大杳蕉 | 亚洲精品综合欧美一区二区三区| 99久久精品美女高潮喷水| 国产精品国产三级国产专区50| 一本大道无码av天堂| 曲麻莱县| 亚洲成av人片在线观看| 免费a级毛片无码视频| 公喝错春药让我高潮| 97超碰精品成人国产| brazzers欧美丰满| 十个男人躁一个女人视频| 免费看片a级毛片免费看| 花房姑娘日本片免费观看| 最近中文字幕完整版| 亚洲av狠狠爱一区二区三区| 和林格尔县|