官术网_书友最值得收藏!

1.2 JavaScript的組成與特性

1.2.1 組成結(jié)構(gòu)

如前所述,JavaScript最初只是一門依附于Web瀏覽器的腳本語(yǔ)言,正是由于Node.js運(yùn)行環(huán)境的出現(xiàn),它才發(fā)展成了如今這樣一門橫跨Web開發(fā)領(lǐng)域的前后端、移動(dòng)設(shè)備端以及桌面應(yīng)用端的全能型編程語(yǔ)言。所以,在討論JavaScript這門語(yǔ)言的時(shí)候,讀者必須要了解該語(yǔ)言除了被ECMAScript標(biāo)準(zhǔn)所定義的核心部分,還有其所在的具體運(yùn)行環(huán)境。

例如,當(dāng)我們討論基于Web瀏覽器的JavaScript的時(shí)候,就應(yīng)該知道這時(shí)候的討論內(nèi)容除了ECMAScript標(biāo)準(zhǔn)所規(guī)定的語(yǔ)法和基本對(duì)象,通常還會(huì)涉及用于處理Web頁(yè)面內(nèi)容的文檔對(duì)象模型(Document Object Model,DOM)和用于處理Web瀏覽器事務(wù)的瀏覽器對(duì)象模型(Brower Object Model,BOM)。但在Node.js運(yùn)行環(huán)境中,DOM和BOM就不存在了,這時(shí)候就要專注于Node.js所提供的核心模塊,以及各種特定用途的第三方模塊了。

總而言之,JavaScript這個(gè)術(shù)語(yǔ)所代表的不僅是ECMAScript標(biāo)準(zhǔn)所規(guī)范的一門腳本語(yǔ)言,還涉及這門語(yǔ)言所在的運(yùn)行環(huán)境。在之后學(xué)習(xí)JavaScript的過(guò)程中,我們會(huì)越來(lái)越意識(shí)到這一點(diǎn)的重要性。這種意識(shí)將有助于理解JavaScript在Web應(yīng)用的前后端開發(fā)中扮演的不同角色,而不至于產(chǎn)生混淆。

1.2.2 語(yǔ)言特性

當(dāng)然,這里所說(shuō)的“全能型編程語(yǔ)言”僅僅指JavaScript適用的領(lǐng)域很廣泛,并不是說(shuō)可以用這門語(yǔ)言來(lái)解決所有的編程問(wèn)題。JavaScript自誕生以來(lái)一以貫之的設(shè)計(jì)理念讓它具備了一些與眾不同的特性,這些特性基本上決定了它的編程思想以及專長(zhǎng)的領(lǐng)域。下面是JavaScript的特性介紹。

  • 動(dòng)態(tài)化類型。和大多數(shù)動(dòng)態(tài)腳本語(yǔ)言一樣,JavaScript中的數(shù)據(jù)類型是直接取決于變量中的“值”的,變量本身沒有數(shù)據(jù)類型上的約束,這也一直是動(dòng)態(tài)腳本語(yǔ)言與編譯型語(yǔ)言最大的區(qū)別之一。也就是說(shuō),JavaScript中的同一個(gè)變量可以存儲(chǔ)不同類型的值。例如,如果我們?cè)贘avaScript代碼中定義了一個(gè)名為x的變量,那么x的初始值可以為數(shù)字,然后在執(zhí)行過(guò)程中被重新賦值為字符串,JavaScript的運(yùn)行環(huán)境會(huì)負(fù)責(zé)自動(dòng)識(shí)別該變量中存儲(chǔ)了什么類型的數(shù)據(jù)。
  • 多范式編程。JavaScript雖然在語(yǔ)法上與Java、C/C++非常類似(例如if-else、switch條件語(yǔ)句,while、for循環(huán)語(yǔ)句等),但在內(nèi)在的設(shè)計(jì)上,它更接近Self和Scheme這一類語(yǔ)言。也就是說(shuō),它既支持面向?qū)ο缶幊蹋仓С种噶钍骄幊毯秃瘮?shù)式編程,因而具有極為靈活的表達(dá)能力。
  • 單線程執(zhí)行。由于最初脫胎于Web瀏覽器,JavaScript一直習(xí)慣采用單線程的執(zhí)行模式(盡管如今有了支持多線程的Worker組件),這一習(xí)慣即使到了Node.js運(yùn)行環(huán)境中也沒變。采用單線程的最大好處是不用像多線程編程那樣處理很容易產(chǎn)生bug的同步問(wèn)題,這就從根本上避免了死鎖問(wèn)題,也避免了線程上下文交換所帶來(lái)的性能上的開銷。當(dāng)然,單線程的執(zhí)行方式也有它自身的弱點(diǎn)。例如,它無(wú)法充分發(fā)揮多核處理器的性能、一個(gè)錯(cuò)誤就會(huì)導(dǎo)致整個(gè)程序崩潰,以及執(zhí)行大量計(jì)算時(shí)會(huì)因長(zhǎng)期占用處理器而影響其他異步I/O的執(zhí)行。
  • 事件驅(qū)動(dòng)。在Web開發(fā)領(lǐng)域,JavaScript之所以能在瀏覽器端扮演越來(lái)越重要的角色,很大程度上得益于其具有與桌面應(yīng)用相似的事件驅(qū)動(dòng)模型。當(dāng)然,這種編程模型雖然具有輕量級(jí)、松耦合等優(yōu)勢(shì),但在多個(gè)異步任務(wù)的場(chǎng)景下,由于程序中的各個(gè)事件是彼此獨(dú)立的,因此它們之間的協(xié)作就成了一個(gè)需要費(fèi)心解決的問(wèn)題。
  • 異步編程。在目前流行的Vue、React等JavaScript前端框架以及Node.js運(yùn)行環(huán)境提供的接口中,我們可以很容易地觀察到其大部分操作都是以異步調(diào)用的方式進(jìn)行的,而這些異步調(diào)用往往以回調(diào)函數(shù)的形式存在,這成了使用JavaScript編程的一大特色。不過(guò),雖然大家都認(rèn)為回調(diào)函數(shù)是執(zhí)行異步調(diào)用并接收其返回?cái)?shù)據(jù)的最佳方式,但這種方式會(huì)導(dǎo)致代碼的編寫順序與其具體執(zhí)行順序不一致。對(duì)于很多習(xí)慣同步編程方式的人來(lái)說(shuō),閱讀這樣的代碼會(huì)是一個(gè)不小的挑戰(zhàn)。另外在流程控制方面,由于程序中穿插了各種異步方法和回調(diào)函數(shù),因此代碼在可讀性上也遠(yuǎn)沒有常規(guī)的同步方式那么一目了然,這也會(huì)給程序的調(diào)試和維護(hù)工作帶來(lái)一定的麻煩。
主站蜘蛛池模板: 开平市| 宁远县| 齐齐哈尔市| 汕头市| 金塔县| 广元市| 临澧县| 桐乡市| 云和县| 东城区| 河西区| 泰安市| 荔波县| 洛隆县| 萍乡市| 哈密市| 巴南区| 本溪| 寿阳县| 金山区| 新巴尔虎右旗| 正镶白旗| 阳朔县| 苏州市| 温州市| 包头市| 长治县| 班戈县| 沙坪坝区| 四会市| 北辰区| 阳信县| 海安县| 岗巴县| 越西县| 新绛县| 于都县| 安阳县| 丁青县| 玉屏| 紫云|