JS(JavaScript)
一.嚴格模式
1.概述數組
在JS中是種限制性更強變種方式,不是個子集,在語義上與正常代碼有明顯得差別
嚴格模式和非嚴格模式可共存,可選擇性的加入嚴格模式app
將JS把陷阱直接變爲明顯錯誤
修正一些引擎難以優化錯誤,代碼有些時候嚴格模式會比非嚴格模式更快
禁用了一些以被定義的語法
2.開啓嚴格模式dom
//開啓嚴格模式-做用於全局做用域 // "use strict " //定義個變量-不使用var關鍵字 a = 100; console.log(a); function fn() { // "use strict" //開啓嚴格模式-做用於函數做用域 v = 200; console.log(v) } fn();
3.變量函數
在非嚴格模式下在函數做用域中定義變量,不使用var關鍵字-自動爲全局變量
在嚴格模式下在函數做用域中定義變量,會報錯
會顯示ReferenceError優化
// 開啓嚴格模式 // "use strict"; v = 100; console.log(v); function fn() { //在非嚴格模式:在函數做用域中定義變量 //不使用var關鍵字-自動爲全局變量 q = 200; console.log(q); } fn(); console.log(q);
在非嚴格模式下靜默失敗
在嚴格模式下會顯示TypeError錯誤this
//開啓嚴格模式 "use strict"; const v = 3.14;//定義變量 v = 1.14;//從新賦值 console.log(v);
在非嚴格模式下使用delete,結果爲靜默失敗
在嚴格模式下使用delete,結果會ReferenceError錯誤prototype
//開啓嚴格模式 "use strict"; //嚴格模式下禁用delete關鍵字-針對刪除變量,而不是數組元素和對象屬性 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 : '犬夜叉'
在非嚴格模式,定義個變量時,使用保留名,靜默失敗
在嚴格模式定義個變量時,使用保留名會語法報錯code
//開啓嚴格模式 "use strict"; var static = 100;//定義個變量 console.log(static);
4.對象對象
非嚴格模式使用delete不可刪除屬性,結果靜默失敗
嚴格模式使用delete不可刪除屬性結果會出現異常TypeError錯誤ip
"use strict" //開啓嚴格模式 // delete Object.prototype; //使用delete 刪除Object對象原型屬性 // console.log(Object.prototype); //在調用Object對象原型屬性 delete Math.random; console.log(Math.random); // Math.random();
在非嚴格模式重名是容許的,重名屬性決定其屬性值
在嚴格模式重名會被認爲語法錯誤
"use strict"; var obj = { name : '犬夜叉', name : '戈薇' } console.log(obj.name); 調用個對象屬性
在非嚴格模式下只讀屬性從新賦值,結果會靜默失敗
在嚴格模式下只讀屬性從新賦值,結果會顯示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);
在非嚴格模式下不可擴展對象添加新屬性,結果會靜默失敗
在嚴格模式下不可擴展對象添加新屬性,結果會顯示TypeError異常
// "use strict"; var obj = {}; Object.preventExtensions(obj); //設置對obj是個不可擴展對象 obj.name = '犬夜叉'; //對象obj新增屬性 console.log(obj);
5.函數
在非嚴格模式下最後個重名參數名會覆蓋以前重名參數,參數仍然能夠經過arguments[i]來訪問
在嚴格模式下重名參數認爲語法顯示出錯
// "use strict"; //開啓嚴格模式 function fn(a, a, b) { //定一個函數 console.log(a + a +b); } fn(1,2,3);
在非嚴格模式下修改參數值也會反應到arguments對象中
在嚴格模式下命名參數與arguments對象是徹底獨立
// "use strict"; //開啓嚴格模式 function fn(value) { //定義哥函數 var value = '犬夜叉'; //定義個變量 console.log(arguments[0]);//犬夜叉 //調用變量 } fn('戈薇');
在非嚴格模式下使用arguments對象的callee()方法調用函數自身
在嚴格模式下使用arguments對象的callee()方法結果會顯示TypeError錯誤
// "use strict"; //開啓嚴格模式 function fn() { //定義哥函數 console.log(arguments.length); // return arguments.callee; } fn(); //調用函數
在非嚴格模式下在任何位置聲明函數是容許的
在嚴格模式下在除全局和函數域聲明函數語法錯誤
"use strict"; //開啓嚴格模式 function fn(){ //定義個函數 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函數創建的變量可在其它位置使用
在嚴格模式下使用eval函數創建的變量只能在eval函數內使用
"use strict"; //開啓嚴格模式 eval('var v = 100,'); //在嚴格模式,增長eval做用域-eval()函數定義變量只能在eval()函數中使用 console.log(v);//100 //在全局做用域中調用變量-報錯
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關鍵字
在非嚴格模式下使用函數apply()和call()或null和undefined會被轉換爲全家對象
在嚴格模式下使用函數的this值最終是指定值,但會顯示出錯
// "use srict"; var v = 100; //定個全局變量 function fn() { // 定義個函數 console.log(this.v); } var obj ={ v : 200 } fn.call(obj);