寫在前面
大家都知道使用"use strict"表示使用ECMAScript進行嚴格模式,使用"use strict"有兩種方式
- 在檔案頭部寫上它(使得整個指令碼都使用嚴格模式)
- 在函式頂部寫上它(只在函式內開啟嚴格模式)
對於嚴格模式和非嚴格模式下,到底有哪些不同,下面我將一一道來。
變數
嚴格模式下 | 非嚴格模式下 |
不允許意外建立全域性變數 | 允許省去var來建立全域性變數 |
不能對變數呼叫delete操作符(也就是說使用delete來刪除變數時操作會直接報錯) | 允許使用delete但操作失敗(也就是說使用delete來刪除變數時操作時不會直接報錯) |
物件
嚴格模式下 | 非嚴格模式下 |
不允許為只讀屬性賦值 | 允許為只讀屬性賦值 |
不允許對不可配置(nonconfiguratable)屬性使用delete操作符 | 允許對不可配置(nonconfiguratable)屬性使用delete操作符 |
不允許為不可擴充套件(nonextensible)的物件新增屬性 | 允許為不可擴充套件(nonextensible)的物件新增屬性 |
使用物件字面量時,屬性名必須唯一 | 使用物件字面量時,屬性名可以重複 |
函式
嚴格模式下 | 非嚴格模式下 |
函式引數不能重複 | 函式引數可以重複,如果重複的話,引數最終的取值為第二個,如果要取得第一個的話則得使用arguments |
函式引數和arguments是完全獨立的 | 修改命名引數的值同時會反映到arguments物件當中 |
淘汰arguments.callee和arguments.caller | arguments.callee代表引用函式本身、arguments.caller呼叫當前引用函式的函式 |
不允許使用inplements、interface、let、package、private、protected、public、static、yield作為函式名 (因為這些是js當中的保留字並且已經在新的語法當中使用起來了) |
允許使用inplements、interface、let、package、private、protected、public、static、yield作為函式名 |
eval
在嚴格模式下在eval中不再建立變數或函式
可以在eval中宣告變數和函式,但這些變數或函式只能被求值的特殊作用域中有效,隨後就被銷燬了。
eval和arguments
嚴格模式下禁止使用eval和arguments作為識別符號,也不允許讀寫它們的值
非嚴格模式下可以重寫eval,也可以給arguments賦值
抑制this
在非嚴格模式下使用apply和call方法時,null或undefined值被轉換為全域性物件
嚴格模式下,傳進去的是什麼,this就是什麼
with
嚴格模式下已經廢棄了with,但是非嚴格模式下可以使用with
parseInt的八進位制
嚴格模式下去掉了javaScript的八進位制字元量