【JavaScript】面向對象之嚴格模式

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,結果爲靜默失敗
在嚴格模式下使用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對象中
在嚴格模式下命名參數與arguments對象是徹底獨立

// "use strict";
//開啓嚴格模式
function fn(value) {
//定義哥函數
    var value = '犬夜叉';
    //定義個變量
    console.log(arguments[0]);//犬夜叉
    //調用變量
}
fn('戈薇');
  • arguments對象的callee()方法

在非嚴格模式下使用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關鍵字

  • 抑制this

在非嚴格模式下使用函數apply()和call()或null和undefined會被轉換爲全家對象
在嚴格模式下使用函數的this值最終是指定值,但會顯示出錯

// "use srict";

var v = 100;
//定個全局變量
function fn() {
    // 定義個函數
    console.log(this.v);
}
var obj ={
    v : 200
}
fn.call(obj);
相關文章
相關標籤/搜索