摘要:開(kāi)啟嚴(yán)格模式設(shè)置對(duì)象是一個(gè)不可擴(kuò)展的對(duì)象為對(duì)象新增屬性張無(wú)忌在非嚴(yán)格模式下為不可擴(kuò)展的對(duì)象添加新屬性,結(jié)果是靜默失敗。
概述 嚴(yán)格模式是什么
嚴(yán)格模式是JavaScript中的一種限制性更強(qiáng)的變種方式。嚴(yán)格模式不是一個(gè)子集:它在語(yǔ)義上與正常代碼有著明顯的差異。
不支持嚴(yán)格模式的瀏覽器與支持嚴(yán)格模式的瀏覽器行為上也不一樣,所以不要在未經(jīng)嚴(yán)格模式特性測(cè)試情況下使用嚴(yán)格模式。
嚴(yán)格模式可以與非嚴(yán)格模式共存,所以腳本可以逐漸的選擇加入嚴(yán)格模式。
首先嚴(yán)格模式會(huì)將JavaScript陷阱直接變成明顯的錯(cuò)誤。
其次就是嚴(yán)格模式修正了一些引擎以?xún)?yōu)化的錯(cuò)誤:同樣的代碼有時(shí)候嚴(yán)格模式會(huì)比非嚴(yán)格模式下更加流暢。
然后,嚴(yán)格模式禁用了一些有可能在未來(lái)版本中定義的語(yǔ)法。
如果想要在JavaScript中開(kāi)啟嚴(yán)格模式,首先要在所有代碼的最前面,定義一個(gè)不會(huì)賦給任何變量的字符串。
如果之前的JavaScript代碼是非嚴(yán)格模式的話,建議不要盲目的為這段代碼開(kāi)啟嚴(yán)格模式,這樣可能會(huì)出現(xiàn)問(wèn)題。在初學(xué)時(shí)期建議按一個(gè)個(gè)的函數(shù)去開(kāi)啟嚴(yán)格模式。
// 開(kāi)啟嚴(yán)格模式 - 作用于全局作用域 // "use strict" // 定義一個(gè)變量 - 不使用var關(guān)鍵字 a = 100; //在非嚴(yán)格模式中可以不使用var關(guān)鍵字,但是嚴(yán)格模式不可以,不然就會(huì)報(bào)錯(cuò)。 console.log(a); function fn(){ // 開(kāi)啟嚴(yán)格模式 - 作用于函數(shù)作用域 "use strict" v = 200; console.log(v); } fn();函數(shù)開(kāi)啟嚴(yán)格模式
嚴(yán)格模式也可以為一個(gè)指定的函數(shù)開(kāi)啟。
function fn(){ "use strict" //在函數(shù)體中開(kāi)啟嚴(yán)格模式,但是函數(shù)意外依舊是非嚴(yán)格模式 v = 200; consolo.log(v); } fn();變量 禁止意外創(chuàng)建變量
在嚴(yán)格模式的情況下,是不允許創(chuàng)建全局變量的。
// 開(kāi)啟嚴(yán)格模式 "use strict"; v = 100;//不使用var關(guān)鍵字 console.log(v); function fn(){ // 在非嚴(yán)格模式:在函數(shù)作用域中定義變量 - 不使用var關(guān)鍵字 -> 自動(dòng)將其提升為全局變量 w = 200; console.log(w); } fn(); console.log(w);靜默失敗轉(zhuǎn)為異常
所謂的靜默失敗就是即不報(bào)錯(cuò)也沒(méi)有任何效果。例如改變常量的值。在嚴(yán)格模式下,靜默失敗會(huì)轉(zhuǎn)換成拋出異常。
// 開(kāi)啟嚴(yán)格模式 "use strict"; const v = 3.14;// 定義常量 v = 1.14;// 重新賦值。嚴(yán)格模式下結(jié)果報(bào)錯(cuò)。 console.log(v);禁用delete關(guān)鍵字
在嚴(yán)格模式下,不能使用變量使用delete運(yùn)算符,但是這種情況只針對(duì)變量,對(duì)數(shù)組和對(duì)象屬性沒(méi)有限制。
// 開(kāi)啟嚴(yán)格模式 "use strict"; // 嚴(yán)格模式下禁用delete關(guān)鍵字 -> 針對(duì)刪除變量,而不是數(shù)組元素和對(duì)象屬性 // var v = 100;// 定義一個(gè)全局變量 // console.log(v); // // delete v;// 刪除全局變量v // console.log(v);// undefined 定義數(shù)組 // var arr = [1,2,3,4,5]; // delete arr[0]; // console.log(arr); 定義對(duì)象 var obj = { name : "張無(wú)忌" } delete obj.name; console.log(obj.name);對(duì)變量名的限制
在嚴(yán)格模式下,JavaScript對(duì)變量名也有限制。特別不能使用如下內(nèi)容作為變量:
上述內(nèi)容都是保留字,在ECMAScript的下一個(gè)版本中可能會(huì)用到他們。
但是在嚴(yán)格模式下,使用上述標(biāo)示符作為變量名會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤。
// 開(kāi)啟嚴(yán)格模式 "use strict"; var static = 100; console.log(static);//結(jié)果-報(bào)錯(cuò)對(duì)象 不可刪除的屬性
在嚴(yán)格模式下,不能使用delete運(yùn)算符刪除不可刪除的屬性。
開(kāi)啟嚴(yán)格模式 "use strict"; //在非嚴(yán)格模式下使用delete刪除不可刪除的屬性 delete Object.prototype;//結(jié)果會(huì)靜默失敗 console.log(Object.prototype); //在嚴(yán)格模式下使用delete刪除不可刪除額屬性,結(jié)果就是拋出異常。 delete Math.random; console.log(Math.random); // Math.random();屬性名必須唯一
在嚴(yán)格模式下,一個(gè)對(duì)象的所有屬性名在對(duì)象內(nèi)必須唯一。
// 開(kāi)啟嚴(yán)格模式 "use strict"; //在非嚴(yán)格模式下重名是允許的,最后一個(gè)重名的屬性就會(huì)覆蓋以上的屬性 //當(dāng)開(kāi)啟嚴(yán)格模式,重名屬性就會(huì)被認(rèn)為是語(yǔ)法錯(cuò)誤 var obj = { name : "張三", name : "李四" } console.log(obj.name);只讀屬性的賦值
在嚴(yán)格模式下,不能為一個(gè)只讀的屬性進(jìn)行重新賦值。
// 開(kāi)啟嚴(yán)格模式 "use strict"; var obj = { name : "張無(wú)忌" } // 用于判斷指定屬性是否為只讀屬性 var result = Object.getOwnPropertyDescriptor(obj, "name"); console.log(result);//在非嚴(yán)格模式下為只讀屬性重新賦值,結(jié)果會(huì)為靜默失敗。 // 定義對(duì)象obj的只讀屬性 Object.defineProperty(obj, "age", { value : 18 }); // 針對(duì)只讀屬性進(jìn)行修改操作 // obj.age = 80; // console.log(obj.age); delete obj.age; console.log(obj.age);不可擴(kuò)展的對(duì)象
在嚴(yán)格模式下,不能為不可擴(kuò)展的對(duì)象添加新屬性。
// 開(kāi)啟嚴(yán)格模式 "use strict"; var obj = {}; // 設(shè)置對(duì)象obj是一個(gè)不可擴(kuò)展的對(duì)象 Object.preventExtensions(obj); // 為對(duì)象obj新增屬性 obj.name = "張無(wú)忌"; console.log(obj); //在非嚴(yán)格模式下為不可擴(kuò)展的對(duì)象添加新屬性,結(jié)果是靜默失敗。函數(shù) 參數(shù)名必須唯一
在嚴(yán)格模式下,要求命名函數(shù)的參數(shù)必須唯一。
// 開(kāi)啟嚴(yán)格模式 "use strict"; function fn(a, a, b){ console.log(a + a + b); //在非嚴(yán)格模式下最后一個(gè)參數(shù)名就會(huì)之前的重名參數(shù),之前的參數(shù)仍然可以銅鼓arguments[i]來(lái)訪問(wèn)。 //在開(kāi)啟嚴(yán)格模式下,重名參數(shù)就會(huì)被認(rèn)為是語(yǔ)法錯(cuò)誤。 } fn(1,2,3);arguments的不同
在嚴(yán)格模式下,arguments對(duì)象的行為也有所不同。
1.在非嚴(yán)格模式下,修改命名參數(shù)的值也會(huì)反應(yīng)到arguments對(duì)象中。
2.在嚴(yán)格模式下,命名參數(shù)與arguments對(duì)象是完全獨(dú)立的。
// 開(kāi)啟嚴(yán)格模式 "use strict"; function fn(value){ var value = "張無(wú)忌"; console.log(value);// 張無(wú)忌 -> 就近原則 /* * 非嚴(yán)格模式下 - arguments對(duì)象獲取參數(shù)的值與形參有關(guān)的 * 如果局部變量與形參名相同 - 根據(jù)就近原則進(jìn)行獲取 * 嚴(yán)格模式下 - arguments對(duì)象獲取參數(shù)的值與形參無(wú)關(guān)的 */ console.log(arguments[0]);// 張無(wú)忌 } fn("周芷若");arguments.callee()
在嚴(yán)格模式下,不能使用arguments對(duì)象的callee()方法。
// 開(kāi)啟嚴(yán)格模式 "use strict"; //在非嚴(yán)格模式下,arguments對(duì)象callee()方法,表示調(diào)用函數(shù)本身 // 在嚴(yán)格模式下,arguments對(duì)象無(wú)法調(diào)用callee()方法,結(jié)果拋出異常 function fn(){ console.log(arguments.length); // return arguments.callee; } fn();函數(shù)聲明的限制
在嚴(yán)格模式下,只能在全局域和函數(shù)域中聲明函數(shù)。
// 開(kāi)啟嚴(yán)格模式 "use strict"; // 在全局作用域 function fn(){ // 在函數(shù)作用域 function n(){} //在非嚴(yán)格模式下,函數(shù)的定義在人格位置聲明函數(shù)都是可以的。 } // 在嚴(yán)格模式下,函數(shù)的定義只能在全局作用域與函數(shù)作用域(不能在塊級(jí)作用域定義函數(shù)),語(yǔ)法錯(cuò)誤 for (var i=0; i<10; i++) { // ECMAScript 6新增 - 存在著塊級(jí)作用域 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)部使用。
// 開(kā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)用變量 - 報(bào)錯(cuò) console.log(v);// 100arguments對(duì)象 禁止讀寫(xiě)
在嚴(yán)格模式下,禁止使用eval()和arguments作為標(biāo)示符,也不允許讀寫(xiě)它們的值。
1.使用var聲明
2.賦值另一個(gè)值
3.嘗試修改包含的值
4.用作函數(shù)名
5.用作命名的函數(shù)的參數(shù)
6.在try...catch語(yǔ)句中用作例外明
// 開(kāi)啟嚴(yán)格模式 "use strict"; //在嚴(yán)格模式下,以下所有嘗試都導(dǎo)致語(yǔ)法錯(cuò)誤 eval = 17; arguments++; ++eval; var obj = { set p(arguments) { } }; var eval; try { } catch (arguments) { } function x(eval) { } function arguments() { } var y = function eval() { }; var f = new Function("arguments", ""use strict"; return 17;");this關(guān)鍵字 抑制this
在非嚴(yán)格模式下使用函數(shù)的apply()或call()方法時(shí),null或undefined值會(huì)被轉(zhuǎn)換為全局對(duì)象。
在嚴(yán)格模式下,函數(shù)的this值始終是指定的值(無(wú)論什么值)。
// 開(kāi)啟嚴(yán)格模式 "use strict"; var v = 100; function fn(){ console.log(this.v); } var obj = { v : 200 } fn.call(obj);// this指向全局對(duì)象
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96987.html
摘要:嚴(yán)格模式嚴(yán)格模式的概念所謂嚴(yán)格模式就是對(duì)中的一種限制性更強(qiáng)的方式屬于代碼的一種強(qiáng)制規(guī)則來(lái)規(guī)范代碼的格式簡(jiǎn)單的說(shuō)就是必須按照嚴(yán)格模式的規(guī)則書(shū)寫(xiě)代碼否則就會(huì)報(bào)錯(cuò)嚴(yán)格模式修正了一些引擎難以?xún)?yōu)化的錯(cuò)誤同樣的代碼有些時(shí)候嚴(yán)格模式會(huì)比非嚴(yán)格模式下更加快 嚴(yán)格模式 嚴(yán)格模式的概念 所謂嚴(yán)格模式就是對(duì)JavaScript中的一種限制性更強(qiáng)的方式. 屬于代碼的一種強(qiáng)制規(guī)則,來(lái)規(guī)范代碼的格式簡(jiǎn)單的說(shuō)就是...
摘要:嚴(yán)格模式描述嚴(yán)格模式可以分別作用在全局作用域中和函數(shù)作用域中嚴(yán)格模式是對(duì)代碼的一種限制方式嚴(yán)格模式可以將不明確顯示的錯(cuò)誤轉(zhuǎn)變成明確顯示嚴(yán)格模式可以修正一些解釋器難以?xún)?yōu)化的錯(cuò)誤嚴(yán)格模式下的變量禁止意外創(chuàng)建變量沒(méi)有開(kāi)啟嚴(yán)格模式時(shí)在調(diào)用該變量時(shí), 嚴(yán)格模式 描述 嚴(yán)格模式可以分別作用在全局作用域中和函數(shù)作用域中 嚴(yán)格模式是對(duì)JavaScript代碼的一種限制方式 嚴(yán)格模式可以將不明確顯...
摘要:一嚴(yán)格模式概述嚴(yán)格模式是什么在中是種限制性更強(qiáng)變種方式,不是個(gè)子集,在語(yǔ)義上與正常代碼有明顯得差異嚴(yán)格模式和非嚴(yán)格模式可共存,可選擇性的加入嚴(yán)格模式嚴(yán)格模式的目的將把陷阱直接變?yōu)槊黠@錯(cuò)誤修正一些引擎難以?xún)?yōu)化錯(cuò)誤,代碼有些時(shí)候嚴(yán)格模式會(huì)比非嚴(yán) JS(JavaScript)一.嚴(yán)格模式1.概述 嚴(yán)格模式是什么 在JS中是種限制性更強(qiáng)變種方式,不是個(gè)子集,在語(yǔ)義上與正常代碼有明顯得差異嚴(yán)格模...
摘要:上一篇面向?qū)ο蟀鎵K之理解對(duì)象下一篇面向?qū)ο蟀鎵K之定義多個(gè)對(duì)象屬性以及讀取屬性特性 這是 javascript 面向?qū)ο蟀鎵K的第二篇文章,主要講解的是對(duì)象的屬性,首先創(chuàng)建一個(gè)對(duì)象: var person = { name: Nicholas, age: 29, job: Software Engineer, sayName: function () { conso...
摘要:面向?qū)ο缶幊虒?duì)象的原生方法分成兩類(lèi)自身的方法靜態(tài)方法和的實(shí)例方法。的靜態(tài)方法方法與,參數(shù)是對(duì)象,返回一個(gè)數(shù)組,數(shù)組的值是改對(duì)象自身的所有屬性名區(qū)別在于返回可枚舉的屬性,返回不可枚舉的屬性值。 面向?qū)ο缶幊?Objects對(duì)象的原生方法分成兩類(lèi):Object自身的方法(靜態(tài)方法)和Object的實(shí)例方法。注意Object是JavaScript的原生對(duì)象,所有的其他對(duì)象都是繼承自O(shè)bjec...
閱讀 2612·2021-11-22 09:34
閱讀 997·2021-11-19 11:34
閱讀 2836·2021-10-14 09:42
閱讀 1523·2021-09-22 15:27
閱讀 2415·2021-09-07 09:59
閱讀 1769·2021-08-27 13:13
閱讀 3459·2019-08-30 11:21
閱讀 802·2019-08-29 18:35