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...