定義全局的變量和函數,會影響代碼的可維護性。若是在頁面中運行的javascript 代碼是在相同的做用域裏面,那就可能代碼之間存在互相影響的可能性。javascript
有不少種手段能夠解決由於定義了全局變量而致使代碼"污染"的問題。java
var myTes={node
length:0'數組
init:function(){...},瀏覽器
action:function(){...}安全
}模塊化
(function()函數
{工具
var length=0;this
function init(){...}
function action(){...}
})()
全部的邏輯都包含在了這個當即執行的匿名函數中,造成了一個獨立的模塊,最大限度的防止了代碼之間的"污染"。固然,在實際的業務中,模塊之間會有交互,這時可以使用return語句,返回須要公開的接口。
var myDocument=(function()
{
var length=0;
function init(){...}
function action(){...}
return {
init:init
}
})();
外部代碼訪問init()方法時,就能夠調用myDocument.init了。此代碼巧妙地作到了代碼邏輯的封裝,又公開了外部須要訪問的接口,是模塊化最佳實踐之一。
(function()
{
length=0;
function init(){...}
function action(){...}
}
)()
//對象建立
var persion=new Object();
person.age=23;
person.name='daniel';
改成:
var person={age:23,name:'daniel'};
//數組建立
var list=new Array();
list[0]=12,
list[1]=20;
list[2]=24;
改成:
var list=[12,20,24];
在javascript中,with語句可用來快捷地訪問對象地屬性。with語句地格式以下:
with(object)
{
.......
}
with語句地原理是:javascirpt解析和運行時,會給with語句單獨創建一個做用域,而和with語句結合的屬性則成爲了此做用域的局部變量,所以可直接訪問。例如:
with(Math)
{
a=PI*r*r;
}
如下代碼等同於以上代碼
a=Math.PI*r*r;
使用with語句確實簡化了代碼,但使用with語句可能也會帶了一些bug已經兼容問題
function f(x,o)
{
with(o)
{
print(x);
}
}
以上with語句中的x,可能來自於參數x,也可能來自o參數上的x屬性。
2.with語句的設計方面也有缺陷,在with語句內部修改和with語句結合的對象後,並不能同步到with內部,即不能保證對象數據的一致性。例如:
var group ={
value:{
node:1
}
};
with(group.value)
{
group.value={
node:2
};
//顯示錯誤:1
console.log(node);
}
//顯示正確:2
console.log(group.value.node);
若是經過變量來獲取某個對象的屬性值,可使用eval('obj.'+key);
其實可使用下標法取得屬性值:obj[key]
2. eval的使用也存在安全性問題,由於它會執行任意傳入的代碼,而傳入的代碼有多是未知的或者來自不受控制的源。
設立嚴格模式的目的主要是爲了消除javascript語法上不合理的地方,從而提升代碼安全性、編譯效率、增長運行速度且更好地兼容javacscript將來的新版本。
嚴格模式主要是針對以下不合理的地方作了改進,包括:禁用with關鍵字、防止意外的全局變量、函數中的this 再也不默認指向全局、防止函數參數重名、防止對象 屬性重名、更安全的使用eval等。
啓用嚴格模式很簡單,主要在代碼中添加以下代碼便可:
"use strict";
使用嚴格模式時須要遵循的幾條最佳實踐。
爲了兼容一些老代碼,最好不要全局啓用嚴格模式,若是想給大量的代碼設置嚴格模式,則能夠把代碼包含在一個當即執行的函數中,並在函數開頭啓用嚴格模式,示例代碼以下:
(function(){
"use strict"
// ..........
})();
2. 若是要更嚴格地編寫javascript代碼,可使用javascript代碼檢查工具。目前最流行的檢查工具主要是JSLint和JSHint。