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

深入理解javascript嚴格模式(Strict Mode)

 更新時間:2014年11月28日 15:08:24   投稿:hebedich  
Strict mode是JavaScript1.8.5引進的技術,但還沒有瀏覽器確實可靠的實現了嚴格模式,所以使用時要小心并且多測試。Strict mode可以應用于整個腳本,也可以適合于單個函數。

ECMAScript5中引入的嚴格模式,通過讓JavaScript運行環(huán)境對一些開發(fā)過程中最常見和不易發(fā)現的錯誤做出和當前不同的處理,來讓開發(fā)者擁有一個”更好”的JavaScript語言。很長一段時間內,由于只有Firefox支持嚴格模式,我曾對嚴格模式表示懷疑。但到了今天,所有主流的瀏覽器都在他們的最新版本中支持了嚴格模式(包括IE10,Opera12和Android4,IOS5)是時候開始使用嚴格模式了。

嚴格模式能起到什么作用?

嚴格模式為JavaScript引入了很多變化,我把他們分為兩類(明顯的和細微的)。細微改進的目標是修復當前JavaScript中的一些細節(jié)問題,對于這些問題我不在這里進行深入介紹;如果你有興趣,請閱讀Dmitry Soshnikov撰寫的精彩文檔ECMA-262-5 in Detail Chapter 2 Strict Mode。 我在這里主要介紹嚴格模式引入的明顯變化,那些在你使用嚴格模式前應該知道的概念和那些對你幫助最大的改變。

在開始學習具體特性前,請記住嚴格模式的一大目標是讓你能更快更方便的調試。運行環(huán)境在發(fā)現問題時顯性的拋出錯誤比默不做聲的失敗或怪異行事(未開啟嚴格模式的JavaScript運行環(huán)境經常這樣)要好。嚴格模式會拋出更多錯誤,但這是好事,因為這些錯誤會喚起你注意并修復很多以前很難被發(fā)現的潛在問題。

去除WITH關鍵詞

首先,嚴格模式中去除了with語句,包含with語句的代碼在嚴格模式中會拋出異常。所以使用嚴格模式的第一步:確保你的代碼中沒有使用with。

復制代碼 代碼如下:

// 在嚴格模式中以下JavaScript代碼會拋出錯誤
with (location) {
    alert(href);
}

防止意外為全局變量賦值

其次,局部變量在賦值前必須先進行申明。在啟用嚴格模式之前,為一個未申明的局部變量復制時會自動創(chuàng)建一個同名全局變量。這是Javacript程序中最容易出現的錯誤之一, 在嚴格模式中嘗試這么做時會有顯性的異常拋出。

復制代碼 代碼如下:

// 嚴格模式下會拋出異常
(function() {
    someUndeclaredVar = "foo";
}());

函數中的THIS不再默認指向全局

嚴格模式中另一個重要的變化是函數中未被定義或為空( null or undefined)的this不在默認指向全局環(huán)境(global)。這會造成一些依賴函數中默認this行為的代碼執(zhí)行出錯,例如:

復制代碼 代碼如下:

window.color = "red";
function sayColor() {
    alert(this.color);
}
// 在strict模式中會報錯, 如果不在嚴格模式中則提示 “red"
sayColor();
// 在strict模式中會報錯, 如果不在嚴格模式中則提示 “red"
sayColor.call(null);

this在被賦值之前會一直保持為undefined,這意味著當一個構造函數在執(zhí)行時,如果之前沒有明確的new關鍵詞,會拋出異常。

復制代碼 代碼如下:

function Person(name) {
    this.name = name;
}
//在嚴格模式中會報錯
var me = Person("Nicholas");

在上面的代碼中,Person構造函數運行時因為之前沒有new,函數中的this會保留為undefined, 由于你不能為undefined設置屬性,上面的代碼會拋出錯誤。 在非strict模式環(huán)境中,沒有被復制的this會默認指向window全局變量,運行的結果將是意外的為window全局變量設置name屬性。

防止重名

當編寫大量代碼時,對象屬性和函數參數很容易一不小心被設置成一個重復的名字。嚴格模式在這種情況下會顯性的拋出錯誤

復制代碼 代碼如下:

//重復的變量名,在嚴格模式下會報錯
function doSomething(value1, value2, value1) {
    //code
}
//重復的對象屬性名,在嚴格模式下會報錯:
var object = {
    foo: "bar",
    foo: "baz"
};

以上的代碼在嚴格模式中都會被認為是語法錯誤而在執(zhí)行前就讓你能得到提示。

安全的 EVAL()

雖然eval()語句最終沒有被移除,但在嚴格模式中仍然對它進行了一些改進。最大的改變是在eval()中執(zhí)行的變量和函數申明不會直接在當前作用域中創(chuàng)建相應變量或函數,例如:

復制代碼 代碼如下:

(function() {
    eval("var x = 10;");
    // 非嚴格模式中,alert 10
    // 嚴格模式中則因x未被定義而拋出異常,
    alert(x);
}());

任何在eval()執(zhí)行過程中創(chuàng)建的變量或者函數保留在eval()中。但你能明確的從eval()語句的返回值來獲取eval()中的執(zhí)行結果,例如:

復制代碼 代碼如下:

(function() {
    var result = eval("var x = 10, y = 20; x + y");
    // 在strict或非strict模式中都能正確的運行余下的語句.(resulst為30)
    alert(result);
}());

對只讀屬性修改時拋出異常

ECMAScript5中還引入為對象的特定屬性設為只讀,或讓整個對象不可修改的能力。 但在非嚴格模式中,嘗試修改一個只讀屬性只會默不做聲的失敗。 在你和一些瀏覽器原生API打交道過程中,你很可能遇到這種情況。嚴格模式會在這種情況下明確的拋出異常,提醒你修改這個屬性是不被允許的。

復制代碼 代碼如下:

var person = {};
Object.defineProperty(person, "name" {
    writable: false,
    value: "Nicholas"
});
// 在非嚴格模式時,沉默的失敗,在嚴格模式則拋出異常.
person.name = "John";

上面的例子中,name屬性被設為只讀,非嚴格模式中執(zhí)行對name屬性的修改不會引發(fā)報錯,但修改不會成功。但嚴格模式則會明確的拋出異常。

NOTE: 強烈建議你在使用任何ECMAScript屬性特性指定時開啟嚴格模式。

如何使用?

在現代瀏覽器中開啟嚴格模式非常容易,只需要在JavaScript代碼中出現以下指令即可

"use strict";
 

雖然看上去上面的代碼僅僅只是未賦予某個變量的字符串,它實際上起到指示JavaScript引擎切換到嚴格模式的作用(不支持嚴格模式的瀏覽器會忽略以上代碼,不會對后續(xù)的執(zhí)行產生任何影響)。雖然你能把這個指令作用到全局或某個函數中,但這里還是要提醒,不要在全局環(huán)境下啟用嚴格模式。

復制代碼 代碼如下:

// 請不要這么使用
"use strict";
function doSomething() {
    // 這部分代碼會運行于嚴格模式
}
function doSomethingElse() {
    // 這部分代碼也會運行于嚴格模式
}

 
雖然上面的代碼看起來不算一個大問題。但當你不負責維護頁面中引入的全部代碼時,這樣使用strict模式會讓你面臨由于第三方代碼沒有為嚴格模式做好準備而引發(fā)的問題。

因此,最好把開啟嚴格模式的指令作用于函數中,例如:

復制代碼 代碼如下:

function doSomething() {
    "use strict";
    // 這個函數中的代碼將會運行于嚴格模式
}
function doSomethingElse() {
    // 這個函數中代碼不會運行于嚴格模式
}

 
如果你想讓嚴格模式在不止一個函數中開啟,請使用立即執(zhí)行函數表達式 (immediately-invoked function expression ,IIFE):

復制代碼 代碼如下:

(function() {
    "use strict";
    function doSomething() {
        // 這個函數運行于嚴格模式
    }
    function doSomethingElse() {
        // 這個函數同樣運行于嚴格模式
    }
}());

結論

我強烈建議你從現在開始就啟用JavaScript嚴格模式,它能幫你發(fā)現代碼中未曾注意到的錯誤。不要在全局環(huán)境中啟用,但你能盡量多的使用IIFE(立即執(zhí)行函數表達式)來把嚴格模式作用到多個函數范圍內。一開始,你會遇到之前未曾碰到過的錯誤提示,這是正常的。當啟用嚴格模式后,請確保在支持的瀏覽器中做了測試,以發(fā)現新的潛在問題。一定不要僅僅在代碼中添加一行”use strict”就假定余下的代碼能正常工作。最后,請在嚴格模式下開始編寫更好的代碼。

注:
這里有各款瀏覽器對嚴格模式支持情況的一個匯總。
可以在這個頁面對當前瀏覽器的嚴格模式支持度進行測試。

嚴格模式的優(yōu)勢:

使JavaScript更牢固
1.      This不再被封裝,在normal mode下,this一直是對象。
2.      Fun.caller和fun.arguments即不是可以刪除的屬性,也不能被set或retrieved。
3.      Arguments.caller也是不可以刪除的屬性,也不能set或retrieved。

為將來的ECMAScript版本鋪平道路
1.      增加了下列保留字:implements, interface, let,package, private, protected, public, static和yield 。
2.      方法聲明應該放在腳本或方法的最前面,不能放在if或for等語句中間。

相關文章

  • bootstrap可編輯下拉框jquery.editable-select

    bootstrap可編輯下拉框jquery.editable-select

    這篇文章主要介紹了bootstrap可編輯下拉框jquery.editable-select的相關資料,需要的朋友可以參考下
    2017-10-10
  • JS實現的最簡Table選項卡效果

    JS實現的最簡Table選項卡效果

    這篇文章主要介紹了JS實現的最簡Table選項卡效果,涉及簡單的JavaScript響應鼠標事件切換樣式的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • 原生js實現點擊輪播切換圖片

    原生js實現點擊輪播切換圖片

    這篇文章主要為大家詳細介紹了原生js點擊輪播切換圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 利用JavaScript創(chuàng)建一個兔年春節(jié)倒數計時器

    利用JavaScript創(chuàng)建一個兔年春節(jié)倒數計時器

    這篇文章主要介紹了如何利用JavaScript創(chuàng)建一個兔年春節(jié)倒數計時器,文中的示例代碼講解詳細,對我們學習JavaScript有一定的幫助,需要的可以參考一下
    2023-01-01
  • JS從非數組對象轉數組的方法小結

    JS從非數組對象轉數組的方法小結

    這篇文章主要給大家介紹了關于JS從非數組對象轉數組的一些方法,分別是Array.prototype.slice.call(obj)、Array.from(obj)、[…obj]和Object.values(obj)等方法的詳細實現方法,需要的朋友可以參考下。
    2018-03-03
  • js 多瀏覽器分別判斷代碼

    js 多瀏覽器分別判斷代碼

    比較實用的多款瀏覽器判斷代碼,需要的朋友可以收集下,適合需要區(qū)別對待不同瀏覽器,執(zhí)行不用的操作的代碼。
    2010-04-04
  • javascript中數組的concat()方法使用介紹

    javascript中數組的concat()方法使用介紹

    數組的concat()方法想必大家比不陌生吧,在本文為大家介紹下javascript中數組的concat()方法的具體使用,感興趣的朋友可以參考下
    2013-12-12
  • 判斷是否是IE6版本并給出提示升級瀏覽器

    判斷是否是IE6版本并給出提示升級瀏覽器

    一個與瀏覽器有關的腳本 ,也是大家從事WEb前端編程常見的編程技巧,就是判斷瀏覽器的版本,如果發(fā)現版本不符合你的設計要求,就給出提示升級瀏覽器,這樣你的網頁會更有體驗。
    2010-06-06
  • 基于element-ui組件手動實現單選和上傳功能

    基于element-ui組件手動實現單選和上傳功能

    在用戶使用過程中提出一鍵導入的功能,需求如下:點擊導入按鈕顯示提示框,然后是單選框以及上傳按鈕。這篇文章主要介紹了基于element-ui組件手動實現單選和上傳功能,需要的朋友可以參考下
    2018-12-12
  • 詳解JavaScript RegExp對象

    詳解JavaScript RegExp對象

    RegExp對象是原生JavaScript中表示正則表達式的對象。接下來通過本文給大家詳細介紹javascript regexp對象知識,需要的的朋友參考下吧
    2017-02-02

最新評論