亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

在JavaScript中使用嚴格模式(Strict Mode)

2024-05-06 16:52:07
字體:
來源:轉載
供稿:網友

前言

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

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

嚴格模式為JavaScript引入了很多變化,我把他們分為兩類(明顯的和細微的)。細微改進的目標是修復當前JavaScript中的一些細節問題,對于這些問題我不在這里進行深入介紹;我在這里主要介紹嚴格模式引入的明顯變化,那些在你使用嚴格模式前應該知道的概念和那些對你幫助最大的改變。

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

1. 去除with關鍵詞

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

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

2. 防止意外為全局變量賦值

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

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

3. 函數中的this不再默認指向全局

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

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

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

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

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

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

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

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

5. 安全的 eval()

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

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

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

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

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

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

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

person.name = "John"; 上面的例子中,name屬性被設為只讀,非嚴格模式中執行對name屬性的修改不會引發報錯,但修改不會成功。但嚴格模式則會明確的拋出異常。

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

如何使用?

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

"use strict";

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

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

雖然上面的代碼看起來不算一個大問題。但當你不負責維護頁面中引入的全部代碼時,這樣使用strict模式會讓你面臨由于第三方代碼沒有為嚴格模式做好準備而引發的問題。 因此,最好把開啟嚴格模式的指令作用于函數中,例如:

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

如果你想讓嚴格模式在不止一個函數中開啟,請使用立即執行函數表達式

(immediately-invoked function expression ,IIFE):(function() {"use strict";function doSomething() {// 這個函數運行于嚴格模式}function doSomethingElse() {// 這個函數同樣運行于嚴格模式}}());

結論

我強烈建議你從現在開始就啟用JavaScript嚴格模式,它能幫你發現代碼中未曾注意到的錯誤。不要在全局環境中啟用,但你能盡量多的使用IIFE(立即執行函數表達式)來把嚴格模式作用到多個函數范圍內。

一開始,你會遇到之前未曾碰到過的錯誤提示,這是正常的。當啟用嚴格模式后,請確保在支持的瀏覽器中做了測試,以發現新的潛在問題。

一定不要僅僅在代碼中添加一行”use strict”就假定余下的代碼能正常工作。最后,請在嚴格模式下開始編寫更好的代碼。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成av人乱码色午夜| 在线激情影院一区| 色吧影院999| 欧美成人免费网| 国产成人午夜视频网址| 精品女同一区二区三区在线播放| 欧美激情第一页xxx| 国产精品丝袜久久久久久不卡| 国产一区二区三区四区福利| 亚洲人成电影网| 色悠久久久久综合先锋影音下载| 成人乱人伦精品视频在线观看| 欧美日韩国产一中文字不卡| 亚洲福利在线视频| 久久久精品日本| 亚洲国产另类 国产精品国产免费| 97精品在线观看| 国产一区欧美二区三区| 亚洲第一色中文字幕| 亚洲人高潮女人毛茸茸| 在线播放日韩专区| 国产欧美va欧美va香蕉在| 欧美高清自拍一区| 福利一区视频在线观看| 欧美xxxx综合视频| 91精品国产沙发| 久久精品影视伊人网| 久久资源免费视频| 日韩视频免费在线观看| 成人午夜一级二级三级| 欧美视频中文字幕在线| 中文字幕成人精品久久不卡| 久久在线免费观看视频| 久久精品国产一区二区三区| 热门国产精品亚洲第一区在线| 亚洲在线免费视频| 91美女高潮出水| 97在线看福利| 国产丝袜一区二区三区免费视频| 国产精品69精品一区二区三区| 亚洲国产古装精品网站| 黑人巨大精品欧美一区二区三区| 久久精品国产免费观看| 久久免费视频这里只有精品| 亚洲欧美一区二区三区久久| 国产精品青草久久久久福利99| 91日本在线观看| 国产精品亚洲一区二区三区| 国内精品久久久久久中文字幕| 久久中文字幕视频| 国产精品中文字幕在线| 亚洲精品一区二区三区婷婷月| 亚洲精品国产拍免费91在线| 亚洲日本aⅴ片在线观看香蕉| 亚洲欧美日韩精品久久亚洲区| 国产91精品高潮白浆喷水| 91久久久久久久久| 欧美午夜丰满在线18影院| 一区二区三区 在线观看视| 久久综合久久八八| 亚洲欧美日韩精品久久奇米色影视| 亚洲免费高清视频| 日韩欧美在线一区| 日韩h在线观看| 欧美精品在线免费观看| 国产精品久久久久久一区二区| 欧美成人激情视频| 久久91亚洲人成电影网站| 在线中文字幕日韩| 在线成人一区二区| 国产精品成人国产乱一区| 国产精品久久久久久一区二区| 亚洲日本欧美中文幕| 久久中国妇女中文字幕| 在线播放国产精品| 日韩成人av在线播放| 亚洲国产天堂久久综合网| 久久深夜福利免费观看| 91社影院在线观看| 欧美国产第一页| 色综合久久久888| 国产一区二区三区四区福利| 日韩av免费在线看| 亚洲精品国产电影| 欧美精品生活片| 性色av一区二区三区在线观看| 57pao成人永久免费视频| 亚洲男人天堂视频| 国产成人精彩在线视频九色| 亚洲国产91色在线| 国产中文字幕91| 亚洲第一级黄色片| 亚洲最大的成人网| 色偷偷偷亚洲综合网另类| 欧美另类在线观看| 久久这里有精品| 欧美成人在线免费视频| 国产日韩专区在线| 精品香蕉一区二区三区| 久久久精品日本| 九九热这里只有在线精品视| 国产在线观看一区二区三区| 日韩成人在线视频网站| 色婷婷成人综合| 97精品一区二区三区| 国产精品678| 国产在线视频2019最新视频| 国产在线精品成人一区二区三区| 精品久久中文字幕久久av| 中文字幕日韩av综合精品| 日韩免费观看网站| 久久免费高清视频| 亚洲国产成人一区| 亚洲图片制服诱惑| 亚洲大尺度美女在线| 51午夜精品视频| 国产精品99蜜臀久久不卡二区| 一区二区三区美女xx视频| 亚洲影视中文字幕| 中文字幕久热精品在线视频| 97久久精品人搡人人玩| 91亚洲一区精品| 久久手机免费视频| 国产欧美精品va在线观看| 91免费高清视频| 久久久91精品| 日韩在线视频导航| 欧美资源在线观看| 国产精品视频久久久| 伦伦影院午夜日韩欧美限制| 亚洲国产女人aaa毛片在线| 国产精品xxxxx| 国产在线视频91| 日韩中文娱乐网| 青青草精品毛片| 久久久久久久久中文字幕| 视频在线一区二区| 久久99国产精品自在自在app| 亚洲精品成人网| 欧美性生交大片免费| 欧美日韩第一视频| 疯狂欧美牲乱大交777| 欧日韩不卡在线视频| 国产区亚洲区欧美区| 久久99国产综合精品女同| 亚洲香蕉av在线一区二区三区| 亚洲免费成人av电影| 在线视频精品一| 欧美日韩成人在线播放| 91精品国产91| 欧美视频裸体精品| 欧美成在线视频| 国产亚洲精品91在线| 6080yy精品一区二区三区| 亚洲人成在线观| 国产在线播放91| 欧美电影院免费观看| 亚洲乱码一区二区| 国产免费观看久久黄| 国产精品国产自产拍高清av水多| 91精品国产成人| 欧美激情国内偷拍| 午夜欧美不卡精品aaaaa| 国产精品视频久久久|