javascript
JavaScript面向对象中的严格模式
概述
嚴(yán)格模式是什么
嚴(yán)格模式是JavaScript中的一種限制性更強的變種方式。嚴(yán)格模式不是一個子集:它在語義上與正常代碼有著明顯的差異。
不支持嚴(yán)格模式的瀏覽器與支持嚴(yán)格模式的瀏覽器行為上也不一樣,所以不要在未經(jīng)嚴(yán)格模式特性測試情況下使用嚴(yán)格模式。
嚴(yán)格模式可以與非嚴(yán)格模式共存,所以腳本可以逐漸的選擇加入嚴(yán)格模式。
嚴(yán)格模式的目的
首先嚴(yán)格模式會將JavaScript陷阱直接變成明顯的錯誤。
其次就是嚴(yán)格模式修正了一些引擎以優(yōu)化的錯誤:同樣的代碼有時候嚴(yán)格模式會比非嚴(yán)格模式下更加流暢。
然后,嚴(yán)格模式禁用了一些有可能在未來版本中定義的語法。
開啟嚴(yán)格模式
全局開啟嚴(yán)格模式
如果想要在JavaScript中開啟嚴(yán)格模式,首先要在所有代碼的最前面,定義一個不會賦給任何變量的字符串。
如果之前的JavaScript代碼是非嚴(yán)格模式的話,建議不要盲目的為這段代碼開啟嚴(yán)格模式,這樣可能會出現(xiàn)問題。在初學(xué)時期建議按一個個的函數(shù)去開啟嚴(yán)格模式。
函數(shù)開啟嚴(yán)格模式
嚴(yán)格模式也可以為一個指定的函數(shù)開啟。
function fn(){'use strict'//在函數(shù)體中開啟嚴(yán)格模式,但是函數(shù)意外依舊是非嚴(yán)格模式v = 200;consolo.log(v); } fn();變量
禁止意外創(chuàng)建變量
在嚴(yán)格模式的情況下,是不允許創(chuàng)建全局變量的。
// 開啟嚴(yán)格模式 "use strict";v = 100;//不使用var關(guān)鍵字 console.log(v);function fn(){// 在非嚴(yán)格模式:在函數(shù)作用域中定義變量 - 不使用var關(guān)鍵字 -> 自動將其提升為全局變量w = 200;console.log(w); } fn(); console.log(w);靜默失敗轉(zhuǎn)為異常
所謂的靜默失敗就是即不報錯也沒有任何效果。例如改變常量的值。在嚴(yán)格模式下,靜默失敗會轉(zhuǎn)換成拋出異常。
// 開啟嚴(yán)格模式 "use strict";const v = 3.14;// 定義常量 v = 1.14;// 重新賦值。嚴(yán)格模式下結(jié)果報錯。console.log(v);禁用delete關(guān)鍵字
在嚴(yán)格模式下,不能使用變量使用delete運算符,但是這種情況只針對變量,對數(shù)組和對象屬性沒有限制。
// 開啟嚴(yán)格模式 "use strict"; // 嚴(yán)格模式下禁用delete關(guān)鍵字 -> 針對刪除變量,而不是數(shù)組元素和對象屬性// var v = 100;// 定義一個全局變量 // console.log(v); // // delete v;// 刪除全局變量v // console.log(v);// undefined 定義數(shù)組 // var arr = [1,2,3,4,5]; // delete arr[0]; // console.log(arr); 定義對象 var obj = {name : '張無忌' } delete obj.name; console.log(obj.name);對變量名的限制
在嚴(yán)格模式下,JavaScript對變量名也有限制。特別不能使用如下內(nèi)容作為變量:
上述內(nèi)容都是保留字,在ECMAScript的下一個版本中可能會用到他們。
但是在嚴(yán)格模式下,使用上述標(biāo)示符作為變量名會導(dǎo)致語法錯誤。
對象
不可刪除的屬性
在嚴(yán)格模式下,不能使用delete運算符刪除不可刪除的屬性。
開啟嚴(yán)格模式 "use strict"; //在非嚴(yán)格模式下使用delete刪除不可刪除的屬性delete Object.prototype;//結(jié)果會靜默失敗console.log(Object.prototype);//在嚴(yán)格模式下使用delete刪除不可刪除額屬性,結(jié)果就是拋出異常。 delete Math.random; console.log(Math.random); // Math.random();屬性名必須唯一
在嚴(yán)格模式下,一個對象的所有屬性名在對象內(nèi)必須唯一。
// 開啟嚴(yán)格模式 "use strict";//在非嚴(yán)格模式下重名是允許的,最后一個重名的屬性就會覆蓋以上的屬性 //當(dāng)開啟嚴(yán)格模式,重名屬性就會被認(rèn)為是語法錯誤 var obj = {name : '張三',name : '李四' } console.log(obj.name);只讀屬性的賦值
在嚴(yán)格模式下,不能為一個只讀的屬性進(jìn)行重新賦值。
// 開啟嚴(yán)格模式 "use strict";var obj = {name : '張無忌' } // 用于判斷指定屬性是否為只讀屬性 var result = Object.getOwnPropertyDescriptor(obj, 'name'); console.log(result);//在非嚴(yán)格模式下為只讀屬性重新賦值,結(jié)果會為靜默失敗。 // 定義對象obj的只讀屬性 Object.defineProperty(obj, 'age', {value : 18 }); // 針對只讀屬性進(jìn)行修改操作 // obj.age = 80; // console.log(obj.age);delete obj.age; console.log(obj.age);不可擴展的對象
在嚴(yán)格模式下,不能為不可擴展的對象添加新屬性。
// 開啟嚴(yán)格模式 "use strict";var obj = {}; // 設(shè)置對象obj是一個不可擴展的對象 Object.preventExtensions(obj);// 為對象obj新增屬性 obj.name = '張無忌'; console.log(obj); //在非嚴(yán)格模式下為不可擴展的對象添加新屬性,結(jié)果是靜默失敗。函數(shù)
參數(shù)名必須唯一
在嚴(yán)格模式下,要求命名函數(shù)的參數(shù)必須唯一。
// 開啟嚴(yán)格模式 "use strict";function fn(a, a, b){console.log(a + a + b); //在非嚴(yán)格模式下最后一個參數(shù)名就會之前的重名參數(shù),之前的參數(shù)仍然可以銅鼓arguments[i]來訪問。 //在開啟嚴(yán)格模式下,重名參數(shù)就會被認(rèn)為是語法錯誤。 } fn(1,2,3);arguments的不同
在嚴(yán)格模式下,arguments對象的行為也有所不同。
1.在非嚴(yán)格模式下,修改命名參數(shù)的值也會反應(yīng)到arguments對象中。
2.在嚴(yán)格模式下,命名參數(shù)與arguments對象是完全獨立的。
arguments.callee()
在嚴(yán)格模式下,不能使用arguments對象的callee()方法。
// 開啟嚴(yán)格模式 "use strict"; //在非嚴(yán)格模式下,arguments對象callee()方法,表示調(diào)用函數(shù)本身 // 在嚴(yán)格模式下,arguments對象無法調(diào)用callee()方法,結(jié)果拋出異常 function fn(){console.log(arguments.length);// return arguments.callee; } fn();函數(shù)聲明的限制
在嚴(yán)格模式下,只能在全局域和函數(shù)域中聲明函數(shù)。
// 開啟嚴(yán)格模式 "use strict";// 在全局作用域 function fn(){// 在函數(shù)作用域function n(){}//在非嚴(yán)格模式下,函數(shù)的定義在人格位置聲明函數(shù)都是可以的。 } // 在嚴(yán)格模式下,函數(shù)的定義只能在全局作用域與函數(shù)作用域(不能在塊級作用域定義函數(shù)),語法錯誤 for (var i=0; i<10; i++) {// ECMAScript 6新增 - 存在著塊級作用域var v = 100;function f(){console.log('this is function');} } console.log(v); f();eval()函數(shù)
增加eval()作用域
在嚴(yán)格模式下使用eval()函數(shù)創(chuàng)建的變量只能在eval()函數(shù)內(nèi)部使用。
// 開啟嚴(yán)格模式 "use strict"; //在非嚴(yán)格模式下eval()函數(shù)創(chuàng)建的變量在其他位置可以使用。 // 在嚴(yán)格模式下,增加eval作用域 - eval()函數(shù)定義的變量只能在當(dāng)前eval()函數(shù)內(nèi)部使用 eval('var v = 100;'); // 在全局作用域中調(diào)用變量 - 報錯 console.log(v);// 100arguments對象
禁止讀寫
在嚴(yán)格模式下,禁止使用eval()和arguments作為標(biāo)示符,也不允許讀寫它們的值。
1.使用var聲明
2.賦值另一個值
3.嘗試修改包含的值
4.用作函數(shù)名
5.用作命名的函數(shù)的參數(shù)
6.在try...catch語句中用作例外明
this關(guān)鍵字
抑制this
在非嚴(yán)格模式下使用函數(shù)的apply()或call()方法時,null或undefined值會被轉(zhuǎn)換為全局對象。
在嚴(yán)格模式下,函數(shù)的this值始終是指定的值(無論什么值)。
總結(jié)
以上是生活随笔為你收集整理的JavaScript面向对象中的严格模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux:apt的源
- 下一篇: 【mysql】二级索引----聚簇索引和