摘要:概述嚴格模式是什么嚴格模式是中的一種限制性更強的變種方式。在嚴格模式下,靜默失敗會轉為報錯。拋出錯誤非嚴格模式下靜默錯誤屬性名必須唯一在嚴格模式下,一個對象內的所有屬性名必須唯一。非嚴格模式最后一個重名參數會覆蓋之前的重名參數。
概述 嚴格模式是什么
嚴格模式是JavaScript中的一種限制性更強的變種方式。
嚴格模式可以和非嚴格模式共存,所以腳本可以逐漸的選擇性加入嚴格模式。
嚴格模式會將js陷阱直接變成明顯的錯誤
嚴格模式修正了一些引擎難以優化的錯誤:同樣的代碼有些時候在嚴格模式下更快
嚴格模式禁用了一些課鞥在未來版本中定義的語法
開啟嚴格模式在js中想要開啟嚴格模式,需要在代碼之前定義一個不會賦給任何變量的固定的字符串
"use strict";或者"use strict";
//全局作用域開啟嚴格模式 "use strict"; //函數作用域開啟嚴格模式 function fun (){ "use strict"http://作用于函數作用域 //其他代碼 }變量 禁止意外的創建變量
在嚴格模式下,創建變量必須使用var關鍵字聲明變量
//全局開啟嚴格模式 "use strict"; //創建全局變量,但不使用var關鍵字 //num = 233;//在非嚴格模式定義變量可以不使用var關鍵字,嚴格模式報錯 //console.log(num);//ReferenceError: num is not defined /*function fun() { v = 100;//在函數作用域中定義變量不適用var關鍵字,自動提升為全局變量 console.log(v) } fun();//ReferenceError: v is not defined*/ function fn() { var a = 200; console.log(a) } fn();//200靜默失敗轉為異常
所謂靜默失敗就是既不報錯也沒有任何效果,例如改變常量的值。在嚴格模式下,靜默失敗會轉為報錯。
"use strict" const v = 23;//非嚴格模式下會靜默失敗 v = 10;//TypeError: Assignment to constant variable. ##禁用delete關鍵字 在嚴格模式下,不能對變量使用delete關鍵字
"use strict"
//定義全局變量
var v = 23;
delete v;//嚴格模式:SyntaxError: Delete of an unqualified identifier in strict mode.
console.log(v);//非嚴格模式:undefined
//嚴格模式下delete關鍵字只是不能對變量使用
##對變量名的限制 在嚴格模式中,不能使用保留字作為變量名,會導致語法錯誤 在非嚴格模式中可以使用保留字作為變量名 ![clipboard.png](/img/bVbfPEs)
"use strict";
var let = 23;//拋出錯誤:SyntaxError: Unexpected strict mode reserved word
#對象 ##不可刪除的屬性 在嚴格模式下,不能用delete運算符刪除不可刪除的屬性。
"use strict";
delete Object.portotype;//拋出錯誤:TypeError: Cannot delete property "prototype" of function Object() { [native code] }
//非嚴格模式下:靜默錯誤
##屬性名必須唯一 在嚴格模式下,一個對象內的所有屬性名必須唯一。
"use strict"
var v {
a = 1,//嚴格模式下對象內的同名屬性編輯器會報錯,運行時不報錯、輸出結果與非嚴格模式一致
a = 2
};
console.log(v.a)//2
##只讀屬性的賦值 在嚴格模式下,不能為一個只讀的屬性賦值,會報錯/非嚴格模式下,靜默失敗。
"use strict"
var obj = {
name : "火鍋"
};
//獲取屬性描述符
console.log(Object.getOwnPropertyDescriptor(obj,"name"));
//給對象obj添加只讀屬性
Object.defineProperty(obj,"age",{
value:2
});
console.log(Object.getOwnPropertyDescriptor(obj,"age"));
//給只讀屬性賦值 - 只讀屬性不能賦值,非嚴格模式下靜默失敗
obj.age = 3;//嚴格模式:TypeError: Cannot assign to read only property "age" of object "#
##不可擴展的對象 在嚴格模式下,不能為不可擴展的對象去添加新屬性
"use strict";
//創建一個空對象
var obj = {};
//將對象設置為不可擴展 - 即不能添加新屬性
Object.preventExtensions(obj);
//為對象添加新屬性 - 非嚴格模式:靜默失敗
obj.name = "九筒";//嚴格模式:TypeError: Cannot add property name, object is not extensible
console.log(obj.name);
#函數 ##參數名必須唯一 在嚴格模式中,要求命名函數的的參數必須唯一。 非嚴格模式:最后一個重名參數會覆蓋之前的重名參數。
"use strict"
function fun (a,a,b){//嚴格模式:重名參數被認為語法錯誤
console.log(a+a+b)//拋出錯誤:SyntaxError: Duplicate parameter name not allowed in this context
}
fun(1,2,3)
##arguments 的不同 - 嚴格模式:argumengs不受形參影響 - 非嚴格模式:argumengs與形參有關
function fun (value){
var value = "火鍋"; console.log(value);//火鍋 - 就近原則 console.log(arguments[0])//嚴格模式:九筒 非嚴格模式:火鍋 - 就近原則
}
fun("九筒");
##arguments對象的callee()方法 在嚴格模式中,不能使用arguments對象的callee()方法 非嚴格模式下使用arguments.callee表示調用函數本身。
"use strict"
function fun (){
return arguments.callee;//拋出TypeError錯誤
}
##函數聲明的限制 在嚴格模式下,只能在全局作用域和函數作用域中聲明函數 非嚴格模式可以在任意位置聲明函數
"use strict"
if(true){
function fun (){}//在塊級作用域(非全局和函數作用域)聲明函數:語法錯誤
}
fun()// 拋出錯誤 ReferenceError: fun is not defined
#增加eval()作用域 在嚴格模式中,使用eval()函數創建的變量只能在eval()函數內部使用 非嚴格模式下,eval()函數創建的變量可以在其他位置使用
"use strict"
eval("var v = 23");
console.log(v);//拋出eferenceError: v is not defined
#禁止讀寫 在嚴格模式下:禁止使用eval()和arguments作為標識符,也不允許讀寫他們的值
"use strict";
//以下全部語法錯誤
var eval = 12
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關鍵字 抑制this - 非嚴格模式使用apply()和call()方法時,null或undefined值會轉換為全局對象 - 嚴格模式下,函數的this值始終是指定的值(無論是什么值)
"use strict"
var v = 2;
function fun (){
console.log(this.v);
}
var obj ={
v : 3
};
fun.call(null);// TypeError: Cannot read property "v" of null
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96983.html
摘要:開啟嚴格模式設置對象是一個不可擴展的對象為對象新增屬性張無忌在非嚴格模式下為不可擴展的對象添加新屬性,結果是靜默失敗。 概述 嚴格模式是什么 嚴格模式是JavaScript中的一種限制性更強的變種方式。嚴格模式不是一個子集:它在語義上與正常代碼有著明顯的差異。不支持嚴格模式的瀏覽器與支持嚴格模式的瀏覽器行為上也不一樣,所以不要在未經嚴格模式特性測試情況下使用嚴格模式。嚴格模式可以與非嚴...
摘要:反之亦然非嚴格合并嚴格看起來是非嚴格的。在普通的里面給一個拼寫錯誤的變量名賦值會使全局對象新增一個屬性并繼續工作盡管后面可能出錯在現在的中有可能。第三嚴格模式禁止刪除聲明變量。 文章整理自MSDN:https://developer.mozilla.org... 1.逐步使用嚴格模式 ECMAScript 5的嚴格模式是JavaScript中的一種限制性更強的變種方式。嚴格模式不是一個...
摘要:針對單個函數將放在函數體的第一行,則整個函數以嚴格模式運行。嚴格模式禁止這種用法,全局變量必須顯式聲明。嚴格模式下,這屬于語法錯誤。嚴格模式禁止這種表示法,整數第一位為,將報錯。也就是說,不允許在非函數的代碼塊內聲明函數。 本文轉自【阮一峰博客】:http://www.ruanyifeng.com/blo... 一、概述 除了正常運行模式,ECMAscript 5添加了第二種運行模式:...
摘要:概述的嚴格模式是中的一種限制性更強的變種方式。嚴格模式在語義上與正常的有一些不同。首先,嚴格模式會將陷阱直接變成明顯的錯誤。嚴格模式禁止刪除聲明變量。 概述 ECMAScript 5的嚴格模式是JavaScript中的一種限制性更強的變種方式。嚴格模式不是一個子集:它在語義上與正常代碼有著明顯的差異。不支持嚴格模式的瀏覽器與支持嚴格模式的瀏覽器行為上也不一樣, 所以不要在未經嚴格模式特...
嚴格模式 首先來了解一下嚴格模式是什么?嚴格模式是JavaScript中的一種限制性更強的變種方式,不是一個子集:它在語義上與正常代碼有明顯的差異,不支持嚴格模式的瀏覽器與支持嚴格模式的瀏覽器行為上也不一樣,所以不要在未經嚴格模式特性測試情況下使用嚴格模式,嚴格模式可以與非嚴格模式共存,所以腳本可以逐漸的選擇性加入嚴格模式 嚴格模式的目的 首先,嚴格模式會將JavaScript陷阱直接變成明顯的錯...
閱讀 2475·2021-10-12 10:11
閱讀 1223·2021-10-11 10:58
閱讀 3263·2019-08-30 15:54
閱讀 704·2019-08-30 13:59
閱讀 674·2019-08-29 13:07
閱讀 1398·2019-08-26 11:55
閱讀 2138·2019-08-26 10:44
閱讀 2635·2019-08-23 18:25