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