JavaScript是一種屬于網(wǎng)絡(luò)的腳本語(yǔ)言,已經(jīng)被廣泛用于Web應(yīng)用開(kāi)發(fā),常用來(lái)為網(wǎng)頁(yè)添加各式各樣的動(dòng)態(tài)功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過(guò)嵌入在HTML中來(lái)實(shí)現(xiàn)自身的功能的。
JavaScript腳本語(yǔ)言具有以下特點(diǎn):
(1)腳本語(yǔ)言。JavaScript是一種解釋型的腳本語(yǔ)言,C、C++等語(yǔ)言先編譯后執(zhí)行,而JavaScript是在程序的運(yùn)行過(guò)程中逐行進(jìn)行解釋。
(2)基于對(duì)象。JavaScript是一種基于對(duì)象的腳本語(yǔ)言,它不僅可以創(chuàng)建對(duì)象,也能使用現(xiàn)有的對(duì)象。
(3)簡(jiǎn)單。JavaScript語(yǔ)言中采用的是弱類型的變量類型,對(duì)使用的數(shù)據(jù)類型未做出嚴(yán)格的要求,是基于Java基本語(yǔ)句和控制的腳本語(yǔ)言,其設(shè)計(jì)簡(jiǎn)單緊湊。
(4)動(dòng)態(tài)性。JavaScript是一種采用事件驅(qū)動(dòng)的腳本語(yǔ)言,它不需要經(jīng)過(guò)Web服務(wù)器就可以對(duì)用戶的輸入做出響應(yīng)。在訪問(wèn)一個(gè)網(wǎng)頁(yè)時(shí),鼠標(biāo)在網(wǎng)頁(yè)中進(jìn)行鼠標(biāo)點(diǎn)擊或上下移、窗口移動(dòng)等操作JavaScript都可直接對(duì)這些事件給出相應(yīng)的響應(yīng)。
(5)跨平臺(tái)性。JavaScript腳本語(yǔ)言不依賴于操作系統(tǒng),僅需要瀏覽器的支持。因此一個(gè)JavaScript腳本在編寫(xiě)后可以帶到任意機(jī)器上使用,前提上機(jī)器上的瀏覽器支 持JavaScript腳本語(yǔ)言,目前JavaScript已被大多數(shù)的瀏覽器所支持。
不同于服務(wù)器端腳本語(yǔ)言,例如PHP與ASP,JavaScript主要被作為客戶端腳本語(yǔ)言在用戶的瀏覽器上運(yùn)行,不需要服務(wù)器的支持。所以在早期程序員比較青睞于JavaScript以減少對(duì)服務(wù)器的負(fù)擔(dān),而與此同時(shí)也帶來(lái)另一個(gè)問(wèn)題:安全性。
而隨著服務(wù)器的強(qiáng)壯,雖然程序員更喜歡運(yùn)行于服務(wù)端的腳本以保證安全,但JavaScript仍然以其跨平臺(tái)、容易上手等優(yōu)勢(shì)大行其道。同時(shí),有些特殊功能(如AJAX)必須依賴Javascript在客戶端進(jìn)行支持。隨著引擎如V8和框架如Node.js的發(fā)展,及其事件驅(qū)動(dòng)及異步IO等特性,JavaScript逐漸被用來(lái)編寫(xiě)服務(wù)器端程序。
JavaScript中創(chuàng)建命名空間的幾種寫(xiě)法
在JavaScript中全局變量經(jīng)常會(huì)引起命名沖突,甚至有時(shí)侯重寫(xiě)變量也不是按照你想像中的順序來(lái)的,可以看看下面的例子:
var sayHello = function() {
return ‘Hello var’;
};
function sayHello(name) {
return ‘Hello function’;
};
sayHello();
最終的輸出為
》 “Hello var”
為什么會(huì)這樣,根據(jù) StackOverFlow 的解釋,實(shí)際上JavaScript的是按如下順序解析的。
function sayHello(name) {
return ‘Hello function’;
};
var sayHello = function() {
return ‘Hello var’;
};
sayHello();
不帶var的function聲明被提前解析了,因此現(xiàn)代的JS寫(xiě)法建議你始終使用前置var聲明所有變量;
避免全局變量名沖突的最好辦法還是創(chuàng)建命名空間,下面是在JS中合建命名空間的幾種常用方法。
通過(guò)函數(shù)(function)創(chuàng)建
這是一種比較常見(jiàn)的寫(xiě)法,通過(guò)聲明一個(gè)function實(shí)現(xiàn),函數(shù)里設(shè)置初始變量,公共方法寫(xiě)入prototype,如:
var NameSpace = window.NameSpace || {};
/*
Function
*/
NameSpace.Hello = function() {
this.name = ‘world’;
};
NameSpace.Hello.prototype.sayHello = function(_name) {
return ‘Hello ’ + (_name || this.name);
};
var hello = new NameSpace.Hello();
hello.sayHello();
這種寫(xiě)法比較冗長(zhǎng),不利于壓縮代碼(jQuery使用fn代替prototype),而且調(diào)用前需要先實(shí)例化(new)。使用Object寫(xiě)成JSON形式可以寫(xiě)得緊湊些:
通過(guò)JSON對(duì)象創(chuàng)建Object
/*
Object
*/
var NameSpace = window.NameSpace || {};
NameSpace.Hello = {
name: ‘world’
, sayHello: function(_name) {
return ‘Hello ’ + (_name || this.name);
}
};
調(diào)用
NameSpace.Hello.sayHello(‘JS’);
》 Hello JS;
這種寫(xiě)法比較緊湊,缺點(diǎn)是所有變量都必須聲明為公有(public)的,導(dǎo)致所有對(duì)這些變量的引用都需要加this指示作用域,寫(xiě)法也略有冗余。
通過(guò)閉包(Closure)和Object實(shí)現(xiàn)
在閉包中聲明好所有變量和方法,并通過(guò)一個(gè)JSON Object返回公有接口:
var NameSpace = window.NameSpace || {};
NameSpace.Hello = (function() {
//待返回的公有對(duì)象
var self = {};
//私有變量或方法
var name = ‘world’;
//公有方法或變量
self.sayHello = function(_name) {
return ‘Hello ’ + (_name || name);
};
//返回的公有對(duì)象
return self;
}());
Object和閉包的改進(jìn)型寫(xiě)法
上個(gè)例子在內(nèi)部對(duì)公有方法的調(diào)用也需要添加self,如:self.sayHello(); 這里可以最后再返回所有公有接口(方法/變量)的JSON對(duì)象。
var NameSpace = window.NameSpace || {};
NameSpace.Hello = (function() {
var name = ‘world’;
var sayHello = function(_name) {
return ‘Hello ’ + (_name || name);
};
return {
sayHello: sayHello
};
}());
Function的簡(jiǎn)潔寫(xiě)法
這是一種比較簡(jiǎn)潔的實(shí)現(xiàn),結(jié)構(gòu)緊湊,通過(guò)function實(shí)例,且調(diào)用時(shí)無(wú)需實(shí)例化(new),方案來(lái)自stackoverflow:
var NameSpace = window.NameSpace || {};
NameSpace.Hello = new function() {
var self = this;
var name = ‘world’;
self.sayHello = function(_name) {
return ‘Hello ’ + (_name || name);
};
};
調(diào)用
NameSpace.Hello.sayHello();
評(píng)論
查看更多