文章出處
文章列表
寫在前面
大家都知道使用"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的八進制字符量
文章列表
全站熱搜
留言列表