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