ECMAScript嚴格模式簡介

靜逸發表於2015-05-12

寫在前面

大家都知道使用"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的八進位制字元量

 

 

 

相關文章