摘要:嚴格模式描述嚴格模式可以分別作用在全局作用域中和函數作用域中嚴格模式是對代碼的一種限制方式嚴格模式可以將不明確顯示的錯誤轉變成明確顯示嚴格模式可以修正一些解釋器難以優化的錯誤嚴格模式下的變量禁止意外創建變量沒有開啟嚴格模式時在調用該變量時,
嚴格模式 描述
嚴格模式可以分別作用在全局作用域中和函數作用域中
嚴格模式是對JavaScript代碼的一種限制方式
嚴格模式可以將不明確顯示的錯誤轉變成明確顯示
嚴格模式可以修正一些解釋器難以優化的錯誤
嚴格模式下的變量 禁止意外創建變量
沒有開啟嚴格模式時
在調用該變量時,不會報錯
解釋器會自動補全 var關鍵字
開啟嚴格模式時
在調用該變量時,會報錯
顯示 ReferenceError: s is not defined
/* 開啟嚴格模式 - 全局作用域 */ "use strict"; /* 定義一個變量 - 不使用 var關鍵字 */ s = 100; /* 沒有開啟嚴格模式時 * 在調用該變量時,不會報錯 * 解釋器會自動補全 var關鍵字 開啟嚴格模式時 * 在調用該變量時,會報錯 * 顯示 ReferenceError: s is not defined(該變量沒有被定義) */ console.log( s );// 顯示 100 - 開啟嚴格模式后的顯示 s is not defined(報錯) * 定義一個函數 */ function fun() { /* 定義一個變量 - 不使用var關鍵字 */ s = 100; console.log( s ); } /* 調用函數 */ fun();// 顯示 100 /* 在未開啟嚴格模式的情況下 * 在函數作用域中,不使用var關鍵字定義的變量,會自動從局部變量提升到全局變量 在開啟嚴格模式的情況下 * 在函數作用域中,不使用var關鍵字定義的變量,會報錯 */ /* 在全局作用域訪問函數作用域中的局部變量 */ console.log( s );// 顯示 100 開啟嚴格模式后的顯示 ReferenceError: s is not defined(報錯)靜默失敗轉為異常
靜默表示既不報錯也不顯示任何效果
在嚴格模式下,靜默失敗會轉為報錯
/* 開啟嚴格模式 */ "use strict"; /* 定義一個常量 */ const c = 100; /* 對常量重新賦值 */ c = 200; /* 開啟嚴格模式后會將靜默失敗轉成報錯 */ console.log( c );// 顯示 TypeError: Assignment to constant variable.禁用delete關鍵字
在非嚴格模式下,對變量使用delete 會靜默失敗
在嚴格模式下,對變量使用delete 會報錯
/* 開啟嚴格模式 */ "use strict"; /* 定義一個變量 */ var s = 100; /* 對變量使用delete * 在非嚴格模式下delete 會無效 * 在嚴格模式下會報錯 SyntaxError: Delete of an unqualified identifier in strict mode. */ delete s; /* 在調用該變量 */ console.log( s );// 顯示 100 ,在嚴格模式下會報錯 Delete of an unqualified identifier in strict mode.對變量名的限制
在非嚴格模式下,定義變量名時,使用保留字,會正常顯示或靜默失敗
在嚴格模式下,定義變量名是,使用保留字,會報錯
/* 開啟嚴格模式 */ "use strict"; /* 定義一個變量 - 使用保留字定義變量名 */ var let = 100; console.log( let ); /* 非嚴格模式 顯示 100 嚴格模式 顯示 SyntaxError: Unexpected strict mode reserved word */嚴格模式下的對象 不可刪除的屬性
在非嚴格模式下,使用delete去刪除不可刪除的屬性時,會靜默失敗
在嚴格模式下,使用delete去刪除不可刪除的屬性時,會報錯
/* 開啟嚴格模式 */ "use strict"; /* 使用delete 刪除Object對象的原型屬性 */ delete Object.prototype; /* 在調用Object對象的原型屬性 */ console.log( Object.prototype ); /* 非嚴格模式下 顯示 {}(正常顯示一個空對象) 嚴格模式下 顯示 TypeError: Cannot delete property "prototype" of function Object() { [native code] } */屬性名必須唯一
在非嚴格模式下,對象的屬性名允許重復,會執行最后一次定義的內容
在嚴格模式下,對象的屬性名重復時,編輯器會報錯,但是會正常運行最后一次定義的內容
/* 開啟嚴格模式 */ "use strict"; /* 定義一個對象 */ var obj = { name : "融念冰", name : "唐三" } /* 調用對象的屬性 */ console.log( obj.name ); /* 非嚴格模式下 顯示 唐三 嚴格模式下 顯示 唐三 */只讀屬性的賦值
在非嚴格模式下,對只讀屬性進行從新賦值,會靜默失敗
在嚴格模式下,對只讀屬性進行重新賦值,會報錯
/* 開啟嚴格模式 */ "use strict"; /* 定義一個對象 */ var obj = { name : "唐三" }; /* 獲取指定屬性的屬性描述符 - 將屬性改為只讀屬性 */ Object.defineProperty( obj, "name", { /* 通過屬性描述符將指定屬性改為只讀 */ writable : false } ); /* 對指定屬性進行修改 */ obj.name = "融念冰"; /* 調用屬性 */ console.log( obj.name ); /* 非嚴格模式下 顯示 唐三(無法修改屬性) 嚴格模式下 顯示 TypeError: Cannot assign to read only property "name" of object "#不可擴展的對象
在非嚴格模式下,對不可擴展的對象添加新屬性,會靜默失敗
在嚴格模式下,對不可擴展的對象添加新屬性,會報錯
/* 開啟嚴格模式 */ "use strict"; /* 定義一個空對象 */ var obj = {}; /* 將指定對象設置為不可擴展的對象 */ Object.preventExtensions( obj ); /* 為不可擴展的對象新增屬性 */ obj.name = "唐三"; /* 調用對象 */ console.log( obj ); /* 非嚴格模式下 顯示 {}(空對象) 嚴格模式下 顯示 TypeError: Cannot add property name, object is not extensible */嚴格模式下的函數 參數名必須唯一
在非嚴格模式下,參數名允許重復,后面匹配的參數會覆蓋之前匹配的參數
在嚴格模式下,參數名重復時,編輯器會提示報錯,運行時也會報錯
/* 開啟嚴格模式 */ "use strict"; /* 定義一個函數 */ function fun( a, a, b ) { console.log( a + a + b ); } /* 調用函數并傳遞參數 */ fun( 1, 2, 3 ); /* 非嚴格模式下 顯示 7(2+2+3) 嚴格模式下 顯示 SyntaxError: Duplicate parameter name not allowed in this context */arguments的不同
在非嚴格模式下,arguments對象獲取參數的值與形參有關
嚴格模式下,arguments對象獲取參數的值與形參無關
/* 開啟嚴格模式 */ "use strict"; /* 定義一個函數 */ function fun( canshu ) { /* 定義局部變量 */ var canshu = "唐三"; /* 調用局部變量 */ console.log( canshu );// 顯示 唐三 /* 通過arguments獲取參數 */ console.log( arguments[0] ); /* 非嚴格模式下 顯示 唐三 * 當局部變量與參數同名時,會根據就近原則進行獲取 嚴格模式下 顯示 融念冰 * 只會獲取在調用函數時傳遞的實參 */ } /* 調用函數并傳遞參數 */ fun( "融念冰" );arguments對象的callee()方法
在非嚴格模式下,callee()方法表示當前調用的函數
在嚴格模式下,arguments對象將無法調用callee()方法,會報錯
/* 開啟嚴格模式 */ "use strict"; /* 定義一個函數 */ function fun() { /* 將callee()方法返回 */ return arguments.callee; } /* 調用函數 */ fun(); /* 非嚴格模式下 顯示 (由于示例代碼的關系,所以沒用顯示) 嚴格模式下 顯示 TypeError: "caller", "callee", and "arguments" properties may not be accessed on strict mode functions or the arguments objects for calls to them */函數聲明的限制
在非嚴格模式下,函數可以在任何作用域下進行定義
在嚴格模式下,函數只能在全局作用域和函數作用域下進行定義
/* 開啟嚴格模式 */ "use strict"; /* 在全局作用域定義函數 */ function fun() { /* 在函數作用域定義內部函數 */ function fn() { } } /* 在 ES6 中新增了一個新的作用域 - 塊級作用域 */ for ( var i = 0 ; i < 10; i++ ) { // 該語句塊中就為塊級作用域 /* 在塊級作用域中定義函數 */ function f() { console.log( "三步白頭" ); } } /* 調用函數 f */ f(); /* 非嚴格模式下 顯示 三步白頭 嚴格模式下 顯示 報錯ReferenceError: f is not defined */嚴格模式下的特殊值 增加eval作用域
在非嚴格模式下,eval()函數創建的變量可以在其他位置進行調用
在嚴格模式下,eval()函數創建的變量只能在當前eval()函數中使用,其他位置調用會報錯
/* 開啟嚴格模式 */ "use strict"; /* 定義eval()函數 */ eval( "var s = "三步白頭"" ); /* 調用eval()函數中變量 */ console.log( s ); /* 非嚴格模式下 顯示 三步白頭 嚴格模式下 顯示 報錯ReferenceError: s is not defined */禁止讀寫
在非嚴格模式下,使用 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;"); /* 非嚴格模式下 顯示 沒有顯示 嚴格模式下 顯示 報錯 SyntaxError: Unexpected eval or arguments in strict mode */抑制this
在非嚴格模式下,在函數使用apply()方法或call()方法來調用函數時,使用null或undefined來代替this的指向對象時,this會指向全局對象
在嚴格模式下,在函數使用apply()方法或call()方法來調用函數時,使用null或undefined來代替this的指向對象時,會報錯
/* 開啟嚴格模式 */ "use strict"; /* 定義全局變量 */ var s = 100; /* 定義函數 */ function fun() { console.log( this.s ); } /* 使用appl()方法或call()方法來調用函數 */ fun.apply( null ); /* 非嚴格模式下 顯示 undefined(瀏覽器環境下 會指向全局變量 并顯示變量值 100) 嚴格模式下 顯示 報錯 TypeError: Cannot read property "s" of null */
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96979.html
摘要:一嚴格模式概述嚴格模式是什么在中是種限制性更強變種方式,不是個子集,在語義上與正常代碼有明顯得差異嚴格模式和非嚴格模式可共存,可選擇性的加入嚴格模式嚴格模式的目的將把陷阱直接變為明顯錯誤修正一些引擎難以優化錯誤,代碼有些時候嚴格模式會比非嚴 JS(JavaScript)一.嚴格模式1.概述 嚴格模式是什么 在JS中是種限制性更強變種方式,不是個子集,在語義上與正常代碼有明顯得差異嚴格模...
摘要:上一篇面向對象版塊之理解對象下一篇面向對象版塊之定義多個對象屬性以及讀取屬性特性 這是 javascript 面向對象版塊的第二篇文章,主要講解的是對象的屬性,首先創建一個對象: var person = { name: Nicholas, age: 29, job: Software Engineer, sayName: function () { conso...
摘要:相信很多人都看過設計模式與開發實踐這本書,每個人都有自己的體會感受,作為前端年開發經驗的程序猿,用我自認為還可以的實踐經驗來與大家談談這本書。這章是前言,后面陸續會講解每個設計模式。 相信很多人都看過《javascript設計模式與開發實踐》這本書,每個人都有自己的體會感受,作為前端3年開發經驗的程序猿,用我自認為還可以的實踐經驗來與大家談談這本書。這章是前言,后面陸續會講解每個設計模...
摘要:命令執行時,構造函數內部的,就代表了新生成的實例對象,表示實例對象有一個屬性,值是。因此,應該非常小心,避免不使用命令直接調用構造函數。命令返回這個對象,而不是對象。JavaScript 面向對象編程的基礎知識篇 1 。 1. 概述 面向對象編程(Object Oriented Programming,縮寫為 OOP)是目前主流的編程范式。 那么,對象(object)到底是什么? 對象是單...
摘要:三的屬性屬性表示傳入函數的實際參數數量,而不是函數聲明時的形參數量。你好你好你好你好你好你好擴展運算符你好你好五嚴格模式嚴格模式和非嚴格模式中,的表現顯示不相同。而在嚴格模式中,實參和的值不會共享。 本文共 635 字,讀完只需 3 分鐘 概述 JavaScript中的函數與其他面向對象語言有幾個不同的地方。 沒有函數重載 有一個表示實參列表的類數組對象 arguments 一、...
閱讀 3826·2021-11-25 09:43
閱讀 2170·2021-11-23 10:11
閱讀 1397·2021-09-29 09:35
閱讀 1310·2021-09-24 10:31
閱讀 2035·2019-08-30 15:48
閱讀 2353·2019-08-29 15:28
閱讀 425·2019-08-29 12:36
閱讀 3490·2019-08-28 18:12