以下是嚴格模式中需要注意的用法,這里需要強調的是:ES6 的 class 和 模塊內都是默認的嚴格模式。其實,js 開發也會逐步走向嚴格模式,這應該是個趨勢。
添加了保留字 protected,static 和 interface 在嚴格模式下,不可以用with()(function(){ //非嚴格模式 var a = {name: "Bob"}; with(a){ name = "Lily"; } console.log(a.name); //Lily })(); (function(){ "use strict"; //嚴格模式 var a = {name: "Bob"}, b = {}; with(a, b){ //SyntaxError: Strict mode code may not include a with statement name = "Lily"; } console.log(a.name); })();在嚴格模式下,變量必須顯示聲明(var/let/const)
(function(){ //非嚴格模式 a = 10; console.log(a); //10 })(); (function(){ "use strict"; //嚴格模式 b = 10; //ReferenceError: b is not defined console.log(b); })();在嚴格模式下,this默認是undefined
(function(){ //非嚴格模式 console.log(this); //window })(); (function(){ "use strict"; //嚴格模式 console.log(this); //undefined })();在嚴格模式下,為只讀變量和不可擴展對象賦值會報錯, 而不是靜默失敗
(function(){ //非嚴格模式 var o = { name: "Lily" }; Object.freeze(o); o.name = "Bob"; o.age = 20; console.log(o); //Object {name: "Bob"} })(); (function(){ "use strict"; //嚴格模式 var o = { name: "Lily" }; Object.freeze(o); o.name = "Bob"; //TypeError: Cannot assign to read only property "name" of object "#在嚴格模式下,不可以在eval參數中定義變量和函數
(function(){ //非嚴格模式 var str1 = "var name="Lily";"; var str2 = "function fun1(){console.log("hello");}"; eval(str1); //這個name定義在了全局,而不是函數內 eval(str2); console.log(name); //Lily fun1(); //hello })(); (function(){ "use strict"; //嚴格模式 var str1 = "var alias="Lily";"; var str2 = "function fun2(){console.log("hello");}"; eval(str1); eval(str2); eval("name = "Bob""); //修改全局變量name console.log(name); //Bob console.log(alias); //ReferenceError: alias is not defined fun2(); //ReferenceError: fun is not defined })();在嚴格模式下,有名參數是arguments參數的靜態副本,而非引用。
(function(){ //非嚴格模式 var name = "Bob"; test(name); function test(alias){ alias = "Lily"; console.log(alias); //Lily console.log(arguments[0]); //Lily } })(); (function(){ "use strict"; //嚴格模式 var name = "Bob"; test(name); function test(alias){ alias = "Lily"; console.log(alias); //Lily console.log(arguments[0]); //Bob } })();在嚴格模式下,用delete刪除var聲明的變量和不可配置屬性時拋出異常,而不是靜默失敗(返回false)
(function(){ //非嚴格模式 var a = 10; var fun = function(){console.log("fun called");}; var o = Object.defineProperty({}, "name", { value: "Bob" }); //默認即不可配置 delete a; //false console.log(a); //10 delete fun; //false fun(); //fun called delete o.name; //false console.log(o.name); //Bob //刪除一個不存在的變量 delete no; //false })(); (function(){ "use strict"; //嚴格模式 var a = 10; var fun = function(){console.log("fun called");}; var o = Object.defineProperty({}, "name", { value: "Bob" }); //默認即不可配置 //delete a; //SyntaxError: Delete of an unqualified identifier in strict mode. console.log(a); delete fun; //SyntaxError: Delete of an unqualified identifier in strict mode. fun(); delete o.name; //SyntaxError: Delete of an unqualified identifier in strict mode. console.log(o.name); //刪除一個不存在的變量 delete no; //SyntaxError: Delete of an unqualified identifier in strict mode. })();在嚴格模式下,arguments和eval是關鍵字,不能被修改
(function(){ //非嚴格模式 eval = 10; eval("console.log("hello");"); //TypeError: eval is not a function (function(){ arguments = 20; console.log(arguments); //20 }()); })(); (function(){ "use strict"; //嚴格模式 eval = 10; //SyntaxError: Unexpected eval or arguments in strict mode eval("console.log("hello");"); (function(){ arguments =20; //SyntaxError: Unexpected eval or arguments in strict mode console.log(arguments); }()); })();在嚴格模式下,不可以用8進制
(function(){ //非嚴格模式 console.log(070); //56 (因瀏覽器而異) })(); (function(){ "use strict"; //嚴格模式 console.log(070); //SyntaxError: Octal literals are not allowed in strict mode. })();在嚴格模式下,函數的形參不可以同名
(function(){ //非嚴格模式 var one = 1; var two = 2; fun(one, two); //2 function fun(a,a){ console.log(a); } })(); (function(){ "use strict"; //嚴格模式 var one = 1; var two = 2; fun(one, two); function fun(a,a){ //SyntaxError: Duplicate parameter name not allowed in this context console.log(a); } })();在嚴格模式下,不可以使用caller和arguments的屬性,會報錯
(function(){ //非嚴格模式 A(); function A(){ B(); } function B(){ console.log(B.caller); //function A(){ B(); } console.log(arguments.callee); //function B(){ console.log(B.caller); console.log(arguments.callee); } } })(); (function(){ "use strict"; //嚴格模式 A(); function A(){ B(); } function B(){ console.log(B.caller); //TypeError: "caller" and "arguments" are restricted function properties and cannot be accessed in this context. console.log(arguments.callee); //TypeError: "caller", "callee", and "arguments" properties may not be accessed on strict mode functions or the arguments objects for calls to them }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97466.html
摘要:函數表達式定義函數表達式區別于函數聲明,也是一種定義函數的方式,形似與變量賦值,這個值就是函數體,例如函數表達式之匿名函數函數表達式之具名函數匿名函數之立即執行函數目前知道的是這三種形式,希望高人補充特點區別于函數聲明,和普通變量一樣使用前 函數表達式 定義:函數表達式區別于函數聲明,也是一種定義函數的方式,形似與變量賦值,這個值就是函數體,例如: var a = function...
摘要:針對單個函數將放在函數體的第一行,則整個函數以嚴格模式運行。嚴格模式禁止這種用法,全局變量必須顯式聲明。嚴格模式下,這屬于語法錯誤。嚴格模式禁止這種表示法,整數第一位為,將報錯。也就是說,不允許在非函數的代碼塊內聲明函數。 本文轉自【阮一峰博客】:http://www.ruanyifeng.com/blo... 一、概述 除了正常運行模式,ECMAscript 5添加了第二種運行模式:...
摘要:題目使用能得到哪些類型和的選擇中有哪些內置函數變量按存儲方式分為哪些類型,并描述其特點如何理解知識點值類型和引用類型值類型引用類型對象,數組,函數值類型直接把值存儲在堆中,把賦值給在內存中是又給開辟了一塊新的空間,存儲了同樣的值。 1.題目 1.JS使用typeof能得到哪些類型 === 和 == 的選擇 JS中有哪些內置函數 JS變量按存儲方式分為哪些類型,并描述其特點 如何理解J...
摘要:然后最后一步就是從父作用域鏈中將該特殊對象刪除,整個過程的偽代碼如下注意這里,該屬性不能刪除,只讀。 起因是我在逛sf的時候看到了一個人的提問: 為什么將函數c賦值給變量b,在函數體里面,給c賦值,為什么會失敗?也就是這代碼執行時為什么c打印出來的不是3 var b = function c () { a=1, b=2, c=3; console.log(a); ...
閱讀 3785·2023-04-26 02:07
閱讀 3671·2021-10-27 14:14
閱讀 2859·2021-10-14 09:49
閱讀 1624·2019-08-30 15:43
閱讀 2611·2019-08-29 18:33
閱讀 2369·2019-08-29 17:01
閱讀 915·2019-08-29 15:11
閱讀 582·2019-08-29 11:06