摘要:嚴格模式嚴格模式的概念所謂嚴格模式就是對中的一種限制性更強的方式屬于代碼的一種強制規則來規范代碼的格式簡單的說就是必須按照嚴格模式的規則書寫代碼否則就會報錯嚴格模式修正了一些引擎難以優化的錯誤同樣的代碼有些時候嚴格模式會比非嚴格模式下更加快
嚴格模式 嚴格模式的概念
所謂嚴格模式就是對JavaScript中的一種限制性更強的方式.
屬于代碼的一種強制規則,來規范代碼的格式簡單的說就是必須按照嚴格模式的規則書寫代碼否則就會報錯
嚴格模式修正了一些引擎難以優化的錯誤: 同樣的代碼有些時候嚴格模式會比非嚴格模式下更加快
開啟嚴格模式 全局開啟嚴格模式就是在所有代碼之前,定義一個不會賦給任何變量的字符串
示例代碼:
// 開啟嚴格模式 - 作用于全局作用域 "use strict"; // 定義一個變量 - 不使用var關鍵字 b = "皮卡丘"; console.log(b);
控制臺示例圖:
沒有開啟嚴格模式時
在調用該變量時,不會報錯
解釋器會自動補全 var關鍵字
開啟嚴格模式時
在調用該變量時,會報錯
示例代碼:
// 開啟嚴格模式 "use strict"; var v = "舒克,貝特"; console.log(v); function fn() { /* 在非嚴格模式: * 在函數作用域中定義變量 - 不適用var關鍵字時JavaScript就會自動將其提升為全局變量 */ w = "貓和老鼠"; console.log(w); } fn(); console.log(w);
控制臺效果對比圖:
靜默表示既不報錯也不顯示任何效果
在嚴格模式下,靜默失敗會轉為報錯
示例代碼:
// 開啟嚴格模式 "use strict"; const v = 12.19;// 定義常量 v = 1993;// 重新賦值 console.log(v);
控制臺效果圖:
注意: 注意: 嚴格模式下禁用delete關鍵字 - 是針對刪除變量,而不是數組元素的對象屬性的
在非嚴格模式下,對變量使用delete 會靜默失敗
在嚴格模式下,對變量使用delete 會報錯
示例代碼:
// 開啟嚴格模式 "use strict"; // 注意: 嚴格模式下禁用delete關鍵字 - 是針對刪除變量,而不是數組元素的對象屬性的 // 定義一個全局變量 var v = "皮卡丘"; console.log(v); delete v;//刪除全局變量v console.log(v); //定義一個數組 var arr = [1,2,3,4,5]; delete arr[0]; console.log(arr); // 定義一個對象 var obj = { name : "花花世界" }; delete obj.name; console.log(obj.name);
控制臺效果對比:
注意: 嚴格模式下不允許把保留字當變量名稱 - 因為在ES6中保留字會變成關鍵字
示例代碼:
// 開啟嚴格模式 "use strict"; /* 注意: 嚴格模式下不允許把保留字當變量名稱 * 因為在ES6中保留字會變成關鍵字 */ var static = "一花一世界"; console.log(static);
控制臺效果對比圖:
在非嚴格模式下,使用delete去刪除不可刪除的屬性時,會靜默失敗
示例代碼:
// 開啟嚴格模式 "use strict"; /* 使用delete 刪除Object對象的原型屬性 */ delete Object.prototype; /* 在調用Object對象的原型屬性 */ console.log(Object.prototype);
控制臺效果對比圖:
當開啟嚴格模式時 - 對象具有相同名稱的屬性時,編輯器報錯(不是運行時報錯)
當非嚴格模式時 - 對象具有相同名稱的屬性時,后面的會覆蓋前面的屬性名
示例代碼:
// 開啟嚴格模式 "use strict"; var obj = { /* 當開啟嚴格模式時 - 對象具有相同名稱的屬性時,編輯器報錯(不是運行時報錯) 當非嚴格模式時 - 對象具有相同名稱的屬性時,后面的會覆蓋前面的屬性名 */ name : "皮卡丘", name : "亞奇洛貝" }; console.log(obj.name);
控制臺效果對比圖:
在非嚴格模式下,對只讀屬性進行從新賦值,會靜默失敗
在嚴格模式下,對只讀屬性進行重新賦值,會報錯
示例代碼:
// 開啟嚴格模式 "use strict"; /* 定義一個對象 */ var obj = { name : "皮卡丘" }; /* 獲取指定屬性的屬性描述符 - 將屬性改為只讀屬性 */ var result = Object.getOwnPropertyDescriptor(obj,"name"); console.log(result); // 定義對象obj的只讀屬性 Object.defineProperty(obj,"age",{ value : 18 }); // 針對只讀屬性進行修改操作 // obj.age = 80; // console.log(obj.age); delete obj.age; console.log(obj.age);
控制臺效果對比圖:
在非嚴格模式下,對不可擴展的對象添加新屬性,會靜默失敗
在嚴格模式下,對不可擴展的對象添加新屬性,會報錯
示例代碼:
// 開啟嚴格模式 "use strict"; /* 定義一個空對象 */ var obj = {}; // 設置對象obj是一個不可擴展的對象 Object.preventExtensions(obj); // 為對象obj新增屬性 obj.name = "皮卡丘"; /* 調用對象 */ console.log(obj);
控制臺效果對比圖:
在非嚴格模式下,參數名允許重復,后面匹配的參數會覆蓋之前匹配的參數
在嚴格模式下,參數名重復時,編輯器會提示報錯,運行時也會報錯
示例代碼:
// 開啟嚴格模式 "use strict"; /* 定義一個函數 */ function fn(a,a,b) { console.log(a + a + b); } /* 調用函數并傳遞參數 */ fn(1,2,3);
控制臺效果對比圖:
嚴格模式下 - arguments對象獲取參數的值與形參有關的
如果局部變量與形參名相同 - 就根據就近原則進行獲取
嚴格模式下 - arguments對象獲取參數的值與形參無關的
示例代碼:
// 開啟嚴格模式 "use strict"; function fn(value) { var value = "皮卡丘"; console.log(value);// 調用結果為 皮卡丘 - 就近原則 /* * 嚴格模式下 - arguments對象獲取參數的值與形參有關的 * 如果局部變量與形參名相同 - 就根據就近原則進行獲取 * 嚴格模式下 - arguments對象獲取參數的值與形參無關的 */ console.log(arguments[0]);// 調用結果為 皮卡丘 , 嚴格模式下調用結果為 皮皮蝦 } fn("皮皮蝦");
控制臺效果對比圖:
在非嚴格模式下,callee()方法表示當前調用的函數
在嚴格模式下,arguments對象將無法調用callee()方法,會報錯
示例代碼:
// 開啟嚴格模式 "use strict"; /* 定義一個函數 */ function fn() { console.log(arguments.length); /* 將callee()方法返回 */ return arguments.callee; } fn();
控制臺效果對比圖:
在嚴格模式下, 函數的定義只能在全局作用域與函數作用域(不能再塊級作用域定義函數)
在非嚴格模式下,函數可以在任何作用域下進行定義
示例代碼:
// 開啟嚴格模式 "use strict"; // 在全局作用域 function fn() { // 在函數作用域 function n() {} } // 在嚴格模式下, 函數的定義只能在全局作用域與函數作用域(不能再塊級作用域定義函數) for (var i=0; i<10; i++){ //ECMAScript 6新增 - 存在著塊級作用域 var v = 100; function f() { console.log("這是一個皮卡丘"); } } console.log(v); f();
控制臺對比效果圖:
在非嚴格模式下,eval()函數創建的變量可以在其他位置進行調用
在嚴格模式下,eval()函數創建的變量只能在當前eval()函數中使用,其他位置調用會報錯
示例代碼:
// 開啟嚴格模式 "use strict"; // 在嚴格模式下,增加eval作用域 - eval()函數定義的變量只能在當前eval()函數中使用 eval("var v = "一花一世界";"); // 在全局作用域中調用變量 - 則會報錯 console.log(v);// 非嚴格模式下調用結果為 一花一世界
控制臺效果對比圖:
在非嚴格模式下,使用 eval 或 arguments 做為標識符(變量名、函數名、對象名)時,會靜默失敗
在嚴格模式下,使用 eval 或 arguments 做為標識符(變量名、函數名、對象名)時,會報錯
示例代碼:
// 開啟嚴格模式 "use strict"; /* 使用 eval 或 arguments 做為標識符 */ 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;");
代碼效果圖:
在非嚴格模式下,在函數使用apply()方法或call()方法來調用函數時,使用null或undefined來代替this的指向對象時,this會指向全局對象
在嚴格模式下,在函數使用apply()方法或call()方法來調用函數時,使用null或undefined來代替this的指向對象時,會報錯
示例代碼:
// 開啟嚴格模式 "use strict"; /* 定義全局變量 */ var v = 100; /* 定義函數 */ function fn() { console.log(this.v); } /* 使用appl()方法或call()方法來調用函數 */ fn.call(obj);// this 指向全局對象
控制臺效果對比圖:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96975.html
摘要:三的屬性屬性表示傳入函數的實際參數數量,而不是函數聲明時的形參數量。你好你好你好你好你好你好擴展運算符你好你好五嚴格模式嚴格模式和非嚴格模式中,的表現顯示不相同。而在嚴格模式中,實參和的值不會共享。 本文共 635 字,讀完只需 3 分鐘 概述 JavaScript中的函數與其他面向對象語言有幾個不同的地方。 沒有函數重載 有一個表示實參列表的類數組對象 arguments 一、...
摘要:開啟嚴格模式設置對象是一個不可擴展的對象為對象新增屬性張無忌在非嚴格模式下為不可擴展的對象添加新屬性,結果是靜默失敗。 概述 嚴格模式是什么 嚴格模式是JavaScript中的一種限制性更強的變種方式。嚴格模式不是一個子集:它在語義上與正常代碼有著明顯的差異。不支持嚴格模式的瀏覽器與支持嚴格模式的瀏覽器行為上也不一樣,所以不要在未經嚴格模式特性測試情況下使用嚴格模式。嚴格模式可以與非嚴...
摘要:面向對象編程對象的原生方法分成兩類自身的方法靜態方法和的實例方法。的靜態方法方法與,參數是對象,返回一個數組,數組的值是改對象自身的所有屬性名區別在于返回可枚舉的屬性,返回不可枚舉的屬性值。 面向對象編程 Objects對象的原生方法分成兩類:Object自身的方法(靜態方法)和Object的實例方法。注意Object是JavaScript的原生對象,所有的其他對象都是繼承自Objec...
摘要:在嚴格模式中,當運算符后跟隨非法的標識符比如變量函數函數參數時,將會拋出一個語法錯誤異常在非嚴格模式中,這種表達式什么也沒做,并返回。 JavaScript之use strict use strict是ECMAScript 5引入的一條指令。指令不是語句(但非常接近于語句)。usestrict指令和普通的語句之間有兩個重要的區別: 它不包含任何語言的關鍵字,指令僅僅是一個包含一個特殊...
摘要:嚴格模式描述嚴格模式可以分別作用在全局作用域中和函數作用域中嚴格模式是對代碼的一種限制方式嚴格模式可以將不明確顯示的錯誤轉變成明確顯示嚴格模式可以修正一些解釋器難以優化的錯誤嚴格模式下的變量禁止意外創建變量沒有開啟嚴格模式時在調用該變量時, 嚴格模式 描述 嚴格模式可以分別作用在全局作用域中和函數作用域中 嚴格模式是對JavaScript代碼的一種限制方式 嚴格模式可以將不明確顯...
閱讀 3349·2021-09-30 09:47
閱讀 2732·2021-08-18 10:22
閱讀 2518·2021-08-16 10:49
閱讀 2884·2019-08-30 15:53
閱讀 2732·2019-08-29 16:14
閱讀 3185·2019-08-28 18:18
閱讀 3229·2019-08-26 13:21
閱讀 787·2019-08-26 12:02