摘要:一嚴格模式概述嚴格模式是什么在中是種限制性更強變種方式,不是個子集,在語義上與正常代碼有明顯得差異嚴格模式和非嚴格模式可共存,可選擇性的加入嚴格模式嚴格模式的目的將把陷阱直接變?yōu)槊黠@錯誤修正一些引擎難以優(yōu)化錯誤,代碼有些時候嚴格模式會比非嚴
JS(JavaScript)
一.嚴格模式
1.概述
嚴格模式是什么
在JS中是種限制性更強變種方式,不是個子集,在語義上與正常代碼有明顯得差異
嚴格模式和非嚴格模式可共存,可選擇性的加入嚴格模式
嚴格模式的目的
將JS把陷阱直接變?yōu)槊黠@錯誤
修正一些引擎難以優(yōu)化錯誤,代碼有些時候嚴格模式會比非嚴格模式更快
禁用了一些以被定義的語法
2.開啟嚴格模式
//開啟嚴格模式-作用于全局作用域 // "use strict " //定義個變量-不使用var關(guān)鍵字 a = 100; console.log(a); function fn() { // "use strict" //開啟嚴格模式-作用于函數(shù)作用域 v = 200; console.log(v) } fn();
3.變量
禁止意外創(chuàng)建變量
在非嚴格模式下在函數(shù)作用域中定義變量,不使用var關(guān)鍵字-自動為全局變量
在嚴格模式下在函數(shù)作用域中定義變量,會報錯
會顯示ReferenceError
// 開啟嚴格模式 // "use strict"; v = 100; console.log(v); function fn() { //在非嚴格模式:在函數(shù)作用域中定義變量 //不使用var關(guān)鍵字-自動為全局變量 q = 200; console.log(q); } fn(); console.log(q);
靜默失敗轉(zhuǎn)為異常
在非嚴格模式下靜默失敗
在嚴格模式下會顯示TypeError錯誤
//開啟嚴格模式 "use strict"; const v = 3.14;//定義變量 v = 1.14;//重新賦值 console.log(v);
禁用delete關(guān)鍵字
在非嚴格模式下使用delete,結(jié)果為靜默失敗
在嚴格模式下使用delete,結(jié)果會ReferenceError錯誤
//開啟嚴格模式 "use strict"; //嚴格模式下禁用delete關(guān)鍵字-針對刪除變量,而不是數(shù)組元素和對象屬性 var v = 100;//定義個全局變量 console.log(v); delete v;//刪除全局變量v console.log(v);//undefined var arr = [1,2,3,4,5]; delete arr[0]; console.log(arr); var obj = { name : "犬夜叉"
對變量名的限制
在非嚴格模式,定義個變量時,使用保留名,靜默失敗
在嚴格模式定義個變量時,使用保留名會語法報錯
//開啟嚴格模式 "use strict"; var static = 100;//定義個變量 console.log(static);
4.對象
不可刪除的屬性
非嚴格模式使用delete不可刪除屬性,結(jié)果靜默失敗
嚴格模式使用delete不可刪除屬性結(jié)果會出現(xiàn)異常TypeError錯誤
"use strict" //開啟嚴格模式 // delete Object.prototype; //使用delete 刪除Object對象原型屬性 // console.log(Object.prototype); //在調(diào)用Object對象原型屬性 delete Math.random; console.log(Math.random); // Math.random();
屬性名必須唯一
在非嚴格模式重名是允許的,重名屬性決定其屬性值
在嚴格模式重名會被認為語法錯誤
"use strict"; var obj = { name : "犬夜叉", name : "戈薇" } console.log(obj.name); 調(diào)用個對象屬性
只讀屬性的賦值
在非嚴格模式下只讀屬性重新賦值,結(jié)果會靜默失敗
在嚴格模式下只讀屬性重新賦值,結(jié)果會顯示TypeError異常
//判斷指定屬性是否是只讀屬性 var obj = { name : "犬夜叉" } // var result = Object.getOwnPropertyDescriptor(obj,"name"); console.log(result); Object.defineProperty(obj,"age",{ //定義對象obj只讀屬性 value : 16 }); //只讀屬性更改 // obj.age = 80; // console.log(obj.age);
不可擴展的對象
在非嚴格模式下不可擴展對象添加新屬性,結(jié)果會靜默失敗
在嚴格模式下不可擴展對象添加新屬性,結(jié)果會顯示TypeError異常
// "use strict"; var obj = {}; Object.preventExtensions(obj); //設(shè)置對obj是個不可擴展對象 obj.name = "犬夜叉"; //對象obj新增屬性 console.log(obj);
5.函數(shù)
參數(shù)名必須唯一
在非嚴格模式下最后個重名參數(shù)名會覆蓋之前重名參數(shù),參數(shù)仍然可以通過arguments[i]來訪問
在嚴格模式下重名參數(shù)認為語法顯示出錯
// "use strict"; //開啟嚴格模式 function fn(a, a, b) { //定一個函數(shù) console.log(a + a +b); } fn(1,2,3);
arguments的不同
在非嚴格模式下修改參數(shù)值也會反應到arguments對象中
在嚴格模式下命名參數(shù)與arguments對象是完全獨立
// "use strict"; //開啟嚴格模式 function fn(value) { //定義哥函數(shù) var value = "犬夜叉"; //定義個變量 console.log(arguments[0]);//犬夜叉 //調(diào)用變量 } fn("戈薇");
arguments對象的callee()方法
在非嚴格模式下使用arguments對象的callee()方法調(diào)用函數(shù)自身
在嚴格模式下使用arguments對象的callee()方法結(jié)果會顯示TypeError錯誤
// "use strict"; //開啟嚴格模式 function fn() { //定義哥函數(shù) console.log(arguments.length); // return arguments.callee; } fn(); //調(diào)用函數(shù)
函數(shù)聲明的限制
在非嚴格模式下在任何位置聲明函數(shù)是允許的
在嚴格模式下在除全局和函數(shù)域聲明函數(shù)語法錯誤
"use strict"; //開啟嚴格模式 function fn(){ //定義個函數(shù) function n(){} } for (var i=0; i<10; i++) { var v = 100; function f(){ console.log("you my function"); } } console.log(v); f();
6.eval()
-增加eval作用域
在非嚴格模式下使用eval函數(shù)建立的變量可在其它位置使用
在嚴格模式下使用eval函數(shù)建立的變量只能在eval函數(shù)內(nèi)使用
"use strict"; //開啟嚴格模式 eval("var v = 100,"); //在嚴格模式,增加eval作用域-eval()函數(shù)定義變量只能在eval()函數(shù)中使用 console.log(v);//100 //在全局作用域中調(diào)用變量-報錯
7.arguments對象
禁止讀寫
在非嚴格模式下使用eval或arguments為標識符時會靜默失敗
在嚴格模式下使用eval或arguments為標識符時會顯示SyntaxError錯誤
// "use strict"; //開啟嚴格模式 evel = 16; arguments++; ++evel; 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 16;");
8.this關(guān)鍵字
抑制this
在非嚴格模式下使用函數(shù)apply()和call()或null和undefined會被轉(zhuǎn)換為全家對象
在嚴格模式下使用函數(shù)的this值最終是指定值,但會顯示出錯
// "use srict"; var v = 100; //定個全局變量 function fn() { // 定義個函數(shù) console.log(this.v); } var obj ={ v : 200 } fn.call(obj);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/96974.html
摘要:上一篇面向?qū)ο蟀鎵K之理解對象下一篇面向?qū)ο蟀鎵K之定義多個對象屬性以及讀取屬性特性 這是 javascript 面向?qū)ο蟀鎵K的第二篇文章,主要講解的是對象的屬性,首先創(chuàng)建一個對象: var person = { name: Nicholas, age: 29, job: Software Engineer, sayName: function () { conso...
摘要:嚴格模式描述嚴格模式可以分別作用在全局作用域中和函數(shù)作用域中嚴格模式是對代碼的一種限制方式嚴格模式可以將不明確顯示的錯誤轉(zhuǎn)變成明確顯示嚴格模式可以修正一些解釋器難以優(yōu)化的錯誤嚴格模式下的變量禁止意外創(chuàng)建變量沒有開啟嚴格模式時在調(diào)用該變量時, 嚴格模式 描述 嚴格模式可以分別作用在全局作用域中和函數(shù)作用域中 嚴格模式是對JavaScript代碼的一種限制方式 嚴格模式可以將不明確顯...
摘要:相信很多人都看過設(shè)計模式與開發(fā)實踐這本書,每個人都有自己的體會感受,作為前端年開發(fā)經(jīng)驗的程序猿,用我自認為還可以的實踐經(jīng)驗來與大家談?wù)勥@本書。這章是前言,后面陸續(xù)會講解每個設(shè)計模式。 相信很多人都看過《javascript設(shè)計模式與開發(fā)實踐》這本書,每個人都有自己的體會感受,作為前端3年開發(fā)經(jīng)驗的程序猿,用我自認為還可以的實踐經(jīng)驗來與大家談?wù)勥@本書。這章是前言,后面陸續(xù)會講解每個設(shè)計模...
摘要:命令執(zhí)行時,構(gòu)造函數(shù)內(nèi)部的,就代表了新生成的實例對象,表示實例對象有一個屬性,值是。因此,應該非常小心,避免不使用命令直接調(diào)用構(gòu)造函數(shù)。命令返回這個對象,而不是對象。JavaScript 面向?qū)ο缶幊痰幕A(chǔ)知識篇 1 。 1. 概述 面向?qū)ο缶幊蹋∣bject Oriented Programming,縮寫為 OOP)是目前主流的編程范式。 那么,對象(object)到底是什么? 對象是單...
摘要:三的屬性屬性表示傳入函數(shù)的實際參數(shù)數(shù)量,而不是函數(shù)聲明時的形參數(shù)量。你好你好你好你好你好你好擴展運算符你好你好五嚴格模式嚴格模式和非嚴格模式中,的表現(xiàn)顯示不相同。而在嚴格模式中,實參和的值不會共享。 本文共 635 字,讀完只需 3 分鐘 概述 JavaScript中的函數(shù)與其他面向?qū)ο笳Z言有幾個不同的地方。 沒有函數(shù)重載 有一個表示實參列表的類數(shù)組對象 arguments 一、...
閱讀 2776·2021-09-24 10:34
閱讀 1879·2021-09-22 10:02
閱讀 2268·2021-09-09 09:33
閱讀 1471·2021-08-13 15:02
閱讀 3281·2020-12-03 17:10
閱讀 1196·2019-08-30 15:44
閱讀 2157·2019-08-30 12:58
閱讀 3239·2019-08-26 13:40