一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

對javascript嚴格模式的理解

時(shí)間:2024-08-18 12:18:53 JavaScript 我要投稿
  • 相關(guān)推薦

對javascript嚴格模式的理解

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

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

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

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

  去除WITH關(guān)鍵詞

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

  復制代碼 代碼如下:

  // 在嚴格模式中以下JavaScript代碼會(huì )拋出錯誤

  with (location) {

  alert(href);

  }

  防止意外為全局變量賦值

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

  復制代碼 代碼如下:

  // 嚴格模式下會(huì )拋出異常

  (function() {

  someUndeclaredVar = "foo";

  }());

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

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

  復制代碼 代碼如下:

  window.color = "red";

  function sayColor() {

  alert(this.color);

  }

  // 在strict模式中會(huì )報錯, 如果不在嚴格模式中則提示 “red"

  sayColor();

  // 在strict模式中會(huì )報錯, 如果不在嚴格模式中則提示 “red"

  sayColor.call(null);

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

  復制代碼 代碼如下:

  function Person(name) {

  this.name = name;

  }

  //在嚴格模式中會(huì )報錯

  var me = Person("Nicholas");

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

  防止重名

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

  復制代碼 代碼如下:

  //重復的變量名,在嚴格模式下會(huì )報錯

  function doSomething(value1, value2, value1) {

  //code

  }

  //重復的對象屬性名,在嚴格模式下會(huì )報錯:

  var object = {

  foo: "bar",

  foo: "baz"

  };

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

  安全的 EVAL()

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

  復制代碼 代碼如下:

  (function() {

  eval("var x = 10;");

  // 非嚴格模式中,alert 10

  // 嚴格模式中則因x未被定義而拋出異常,

  alert(x);

  }());

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

  復制代碼 代碼如下:

  (function() {

  var result = eval("var x = 10, y = 20; x + y");

  // 在strict或非strict模式中都能正確的運行余下的語(yǔ)句.(resulst為30)

  alert(result);

  }());

  對只讀屬性修改時(shí)拋出異常

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

  復制代碼 代碼如下:

  var person = {};

  Object.defineProperty(person, "name" {

  writable: false,

  value: "Nicholas"

  });

  // 在非嚴格模式時(shí),沉默的失敗,在嚴格模式則拋出異常.

  person.name = "John";

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

  NOTE: 強烈建議你在使用任何ECMAScript屬性特性指定時(shí)開(kāi)啟嚴格模式。

  如何使用?

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

  "use strict";

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

  復制代碼 代碼如下:

  // 請不要這么使用

  "use strict";

  function doSomething() {

  // 這部分代碼會(huì )運行于嚴格模式

  }

  function doSomethingElse() {

  // 這部分代碼也會(huì )運行于嚴格模式

  }

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

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

  復制代碼 代碼如下:

  function doSomething() {

  "use strict";

  // 這個(gè)函數中的代碼將會(huì )運行于嚴格模式

  }

  function doSomethingElse() {

  // 這個(gè)函數中代碼不會(huì )運行于嚴格模式

  }

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

  復制代碼 代碼如下:

  (function() {

  "use strict";

  function doSomething() {

  // 這個(gè)函數運行于嚴格模式

  }

  function doSomethingElse() {

  // 這個(gè)函數同樣運行于嚴格模式

  }

  }());

  結論

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

  注:

  這里有各款瀏覽器對嚴格模式支持情況的一個(gè)匯總。

  可以在這個(gè)頁(yè)面對當前瀏覽器的嚴格模式支持度進(jìn)行測試。

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

  使JavaScript更牢固

  1. This不再被封裝,在normal mode下,this一直是對象。

  2. Fun.caller和fun.arguments即不是可以刪除的屬性,也不能被set或retrieved。

  3. Arguments.caller也是不可以刪除的屬性,也不能set或retrieved。

  為將來(lái)的ECMAScript版本鋪平道路

  1. 增加了下列保留字:implements, interface, let,package, private, protected, public, static和yield 。

  2. 方法聲明應該放在腳本或方法的最前面,不能放在if或for等語(yǔ)句中間。

【對javascript嚴格模式的理解】相關(guān)文章:

對javascript的理解08-08

常用的JavaScript模式09-22

理解JavaScript原型鏈教程09-02

javascript的閉包概念怎么理解06-15

javascript面向對象中的對象怎么理解09-02

淺談javascript中的單線(xiàn)程理解08-16

有關(guān)深入理解JavaScript中的并行處理的介紹10-14

Javascript的this用法簡(jiǎn)述08-15

JavaScript學(xué)習筆記08-24

JavaScript 基礎教學(xué)09-29

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看