嚴格模式的不同

2021-08-21 04:30:13 字數 1509 閱讀 8349

1、嚴格模式開啟:

整個指令碼在嚴格模式下執行:在標籤內上方寫上"use strict"

某個函式在嚴格模式下執行:在函式內部頂端寫上"use strict"

2、簡化變數使用

禁止使用with;

eval不再為上層引入新變數,但仍能訪問上層資源,修改上層資源;

不能刪除宣告的變數;

3、拼寫錯誤轉為異常

意外建立全域性變數(不適用var let宣告變數);

靜默失敗(如對不能寫的屬性修改值,凍結的物件操作等);

刪除不能刪除的屬性 delete object.prototype;

物件屬性不能重名:;

函式引數名唯一:function m(a, a, c){};

禁止使用八進位制數字語法:0654,es6支援0o字首表示八進位制;

禁止給原始值設定屬性:"name".you = 'he';

4、eval/arguments簡單化

簡單來說 eval和arguments不能當做變數進行操作 例如eval=10;arguments++;不能當做函式名、變數名等;

引數值不隨arguments的值變化而變化;

禁用arguments.callee、arguments.caller,不能為函式.caller屬性賦值;非嚴格模式arguments.caller=undefined,函式.caller指向呼叫當前函式的函式,若在全域性為null,arguments.callee指向當前函式

5、安全的js

如果沒有指定this ,那麼this的值為undefined,全域性環境,this為window,直接呼叫的函式內有this,標準為window,嚴格模式為undefined;

fun.caller/fun.arguments都不能刪除、不能存值取值;

6、總結

eval 和 arguments 不能作為變數被賦值,不能作為函式名,引數名,函式的引數不能有同名屬性,否則報錯;

變數必須宣告後再使用,否則會報錯,referenceerror錯誤;

不能使用with語句;

不能對唯讀屬性賦值,否則報錯;

不能使用字首0表示八進位制數,否則報錯;

不能刪除不可刪除的屬性,否則報錯;

不能刪除變數delete prop,會報錯,只能刪除屬性delete global[prop];

eval不會在它的外層作用域引入變數,即內部變數不能在外部呼叫;

arguments不會自動反映函式引數的變化,重寫arguments的值報錯:arguments = [5];

禁用arguments.callee、arguments.caller;

禁止this指向全域性物件;

不能使用fn.caller和fn.arguments獲取函式呼叫的堆疊;

增加了保留字(比如protected、static和inte***ce)

Hive的嚴格模式和非嚴格模式

通過開啟嚴格模式,主要是為了禁止某些查詢 這些查詢可能造成意想不到的壞的結果 目前主要禁止3種型別的查詢 1 分割槽表查詢 在查詢乙個分割槽表時,必須在where語句後指定分割槽字段,否則不允許執行。因為在查詢分割槽表時,如果不指定分割槽查詢,會進行全表掃瞄。而分割槽表通常有非常大的資料量,全表掃瞄...

JavaScript嚴格模式與非嚴格模式之間的區別

嚴格模式 非嚴格模式 禁止使用with語句 允許使用with語句 所有變數要先宣告 使用未宣告的變數將隱式宣告為全域性變數 函式 非方法 中的this是undefinedthis是全域性物件 給唯讀屬性和不可擴充套件的物件建立新成員將丟擲型別錯誤異常 只是簡單的操作失敗 傳入eval 的 不能在定義...

MySQL 嚴格模式與非嚴格模式

檢視 mysql 是否是嚴格模式 select sql mode 如果顯示包含 strict trans tables 或 strict all tables,則代表 mysql 開啟了嚴格模式 反之,是非嚴格模式 非嚴格模式是乙個相對概念 對於 innodb 引擎來說,strict trans t...