欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript起點(diǎn)(嚴(yán)格模式深度了解)

 更新時(shí)間:2013年01月28日 14:17:00   作者:  
嚴(yán)格模式(Strict Mode)是ECMAScript5新增的功能,目前所有的主流瀏覽器的最新版本——包括IE10與Opera12——都支持嚴(yán)格模式,感興趣的朋友可以了解下啊,希望本文對(duì)你有所幫助
嚴(yán)格模式(Strict Mode)是ECMAScript5新增的功能。ECMAScript5雖然可以向后兼容ECMAScript3,但如果使用嚴(yán)格模式,哪些ECMAScript5“不在建議使用”的ECMAScript3語法功能將會(huì)被全部進(jìn)制,如果出現(xiàn)就會(huì)拋出一行。引入Strict Mode目的是允許開發(fā)人員能夠選擇“更好”的Javascript版本,這個(gè)版本能用不同的方式處理那些普遍而又臭名昭著的錯(cuò)誤。目前所有的主流瀏覽器的最新版本——包括IE10與Opera12——都支持嚴(yán)格模式。關(guān)于嚴(yán)格模式的大多數(shù)信息都可以在《ES5規(guī)范》[PDF]的第223頁找到。

如何啟用嚴(yán)格模式
可以在全局范圍內(nèi)使用嚴(yán)格模式,也可以在一個(gè)函數(shù)范圍內(nèi)使用嚴(yán)格模式。如果要再全局范圍內(nèi)啟用嚴(yán)格模式,只需要在程序的第一行使用代碼即可:
復(fù)制代碼 代碼如下:

'use strict';

在函數(shù)的內(nèi)部啟用嚴(yán)格模式,只需要在函數(shù)體內(nèi)第一行使用代碼即可:
復(fù)制代碼 代碼如下:

function imStrict(){
  'use strict';
  // ... 其他代碼 ...
}

啟用嚴(yán)格模式的語句只是一段普通的字符串“use strict”,沒有任何新語法。這意味著不會(huì)對(duì)就舊式瀏覽器造成任何負(fù)面影響,因此可以大膽使用。

在函數(shù)內(nèi)部啟用嚴(yán)格模式的一個(gè)實(shí)際應(yīng)用是,把整個(gè)Javascript類庫定義在嚴(yán)格模式的函數(shù)內(nèi)部,這樣就可以不影響外部的代碼:
復(fù)制代碼 代碼如下:

(function(){
  "use strict";
  // Define your library strictly...
})();

嚴(yán)格模式帶來了什么?
在開始介紹特殊特性之前,你需要記住,嚴(yán)格模式的目標(biāo)之一是允許更快地調(diào)試錯(cuò)誤。幫助開發(fā)者調(diào)試的最佳途徑是當(dāng)確定的問題發(fā)生時(shí)拋出相應(yīng)的錯(cuò)誤(throw errors when certain patterns occur),而不是悄無聲息地失敗或者表現(xiàn)出奇怪的行為(這正是如今不在嚴(yán)格模式下的Javascript做的)。嚴(yán)格模式下的代碼拋出更多的錯(cuò)誤信 息,這是好事,因?yàn)樗軒椭_發(fā)者很快注意到一些必須立即解決的問題。

去除with語句(Eliminates with)
首先,嚴(yán)格模式去除了with語句。當(dāng)with語句出現(xiàn)在嚴(yán)格模式中時(shí),它會(huì)被認(rèn)為是非法的Javascript語句并拋出語法錯(cuò)誤。所以,使用嚴(yán)格模式的第一步就是確保你沒有在使用with。
復(fù)制代碼 代碼如下:

// 在嚴(yán)格模式中將導(dǎo)致語法錯(cuò)誤
with(location){
alert(href);
}

防止意外的全局變量(Prevents accidental globals)
第二點(diǎn)是,變量在賦值之前必須聲明。在非嚴(yán)格模式下,給一個(gè)未聲明的變量賦值將自動(dòng)生成一個(gè)該名字的全局變量。這是Javascript中最普遍的錯(cuò)誤之一。嚴(yán)格模式中,這樣做將拋出一個(gè)錯(cuò)誤。
復(fù)制代碼 代碼如下:

// 嚴(yán)格模式中拋出一個(gè)錯(cuò)誤
(function(){
someUndeclaredVar ="foo";
}());

取消this值的強(qiáng)制轉(zhuǎn)換(Eliminates this coercion)
另一個(gè)重要的變化是,當(dāng)this值為null或undefined時(shí),不會(huì)再將其強(qiáng)制轉(zhuǎn)換為全局對(duì)象。也就是說,this保留了它的原始值,也因此可能會(huì)導(dǎo)致一些依賴于強(qiáng)制轉(zhuǎn)換的代碼發(fā)生錯(cuò)誤。例如:
復(fù)制代碼 代碼如下:

window.color ="red";
function sayColor(){
// 嚴(yán)格模式下,this不會(huì)指向window
alert(this.color);
}
// 以下兩種情況,在嚴(yán)格模式下都拋出錯(cuò)誤
sayColor();
sayColor.call(null);

根本而言,this值必須賦值,否則將保留undefined值。這意味著調(diào)用構(gòu)造函數(shù)時(shí)若漏掉了new關(guān)鍵字也會(huì)導(dǎo)致錯(cuò)誤:
復(fù)制代碼 代碼如下:

functionPerson(name){
this.name = name;
}
// 嚴(yán)格模式下導(dǎo)致錯(cuò)誤
var me =Person("Nicholas");

在這段代碼里,調(diào)用Person構(gòu)造函數(shù)時(shí)缺少了new關(guān)鍵字,此時(shí)this值為undefined。由于你不能給undefined添加屬性,這段代碼拋出了一個(gè)錯(cuò)誤。在非嚴(yán)格模式下,this會(huì)強(qiáng)制轉(zhuǎn)換為全局對(duì)象,因此name屬性能夠被正確賦值為全局變量。
拒絕重復(fù)(No duplicates)
當(dāng)你做了大量的編碼的時(shí)候,你很容易在對(duì)象中定義了重復(fù)的屬性或者給函數(shù)定義了重復(fù)的參數(shù)名。嚴(yán)格模式下,這兩種情況都會(huì)導(dǎo)致錯(cuò)誤的發(fā)生:
復(fù)制代碼 代碼如下:

// 嚴(yán)格模式下錯(cuò)誤 - 重復(fù)參數(shù)
function doSomething(value1, value2, value1){
//code
}
// 嚴(yán)格模式下錯(cuò)誤 - 重復(fù)屬性
var object ={
foo:"bar",
foo:"baz"
};

這兩者都是語法錯(cuò)誤,在代碼執(zhí)行之前將拋出錯(cuò)誤。
更安全的eval()(Safer eval())
eval()沒有被移除,但它在嚴(yán)格模式下發(fā)生了一些變化。最大的改變是:在eval()語句中聲明的變量以及函數(shù)不會(huì)在包含域中創(chuàng)建。例如:
復(fù)制代碼 代碼如下:

(function(){
eval("var x = 10;");
// 非嚴(yán)格模式下,x為10
// 嚴(yán)格模式下,x沒有聲明,拋出一個(gè)錯(cuò)誤
alert(x);
}());

任意由eval()創(chuàng)建的變量或函數(shù)仍呆在eval()里。然而,你可以通過從eval()中返回一個(gè)值的方式實(shí)現(xiàn)值的傳遞:
復(fù)制代碼 代碼如下:

(function(){
var result =eval("var x = 10, y = 20; x + y");
// 嚴(yán)格模式與非嚴(yán)格模式下都能正常工作(得到30)
alert(result);
}());

不可改變引發(fā)的錯(cuò)誤(Errors for immutables)
ECMAScript 5 同時(shí)引入了修改屬性特征的能力,例如設(shè)置一個(gè)屬性為只讀或者凍結(jié)整個(gè)對(duì)象的結(jié)構(gòu)(freezing an entire object's structure)。在非嚴(yán)格模式下,試圖修改一個(gè)不可變的屬性時(shí)將悄無聲息地失敗。你可能在使用一些原生APIs的時(shí)候已經(jīng)遇到這類問題。嚴(yán)格模式將 保證無論你在何時(shí)試圖使用一種不被允許的方式修改一個(gè)對(duì)象或?qū)ο蟮膶傩詴r(shí)拋出錯(cuò)誤。
復(fù)制代碼 代碼如下:

var person ={};
Object.defineProperty(person,"name"{
writable:false,
value:"Nicholas"
});
// 非嚴(yán)格模式下將悄無聲息地失敗,嚴(yán)格模式則拋出錯(cuò)誤
person.name ="John";

這個(gè)例子中,name屬性被設(shè)置為只讀。在非嚴(yán)格模式下,對(duì)name的賦值將悄無聲息地失敗;而在嚴(yán)格模式下,一個(gè)錯(cuò)誤將被拋出。

:如果你在使用ECMAScript屬性能力(the ECMAScript attribute capabilities),我強(qiáng)烈推薦你開啟嚴(yán)格模式。如果你在改變對(duì)象的可變性(mutability of objects),你將遇到一堆錯(cuò)誤,而它們?cè)诜菄?yán)格模式下將被安靜地帶過。

相關(guān)文章

最新評(píng)論