一 .      嚴格模式

               1.     使用 use strict 指令後,後續的程式碼將會解析為嚴格程式碼

               2.     eval()呼叫時所處的程式碼是 嚴格程式碼或是它要執行的字串使用了 scrict code 指令,則其內部程式碼為嚴格程式碼

二.     嚴格程式碼與非嚴格程式碼的區別

                1.    嚴格程式碼禁止使用 with 語句

                2.    嚴格模式:所有的變數都要先宣告,如果給一個未宣告的變數,函式,函式引數,catch從句引數或全域性物件的屬性賦值,將會丟擲引用錯誤異常;

                        非嚴格模式:  隱式宣告的全域性變數  是給全域性物件新新增一個新屬性

                3.    嚴格模式: 呼叫函式(不是方法)中的 this 值為 undefined;

                        非嚴格模式:this 是全域性物件

                         注:可通過該特性來判斷js實現是否支援嚴格模式在方法裡return   this ===undefined;

                4.    嚴格格式:通過 call()  或 apply() 來呼叫函式時,this 是通過他們傳入的第一個引數

                       非嚴格模式:null 和 undefined 值被全域性物件和轉換為物件的非物件值所代替

                5.    嚴格模式:    給只讀屬性賦值 或 給 不可擴充套件的物件 建立新成員都會丟擲型別錯誤異常

                       非嚴格模式: 操作失敗,不會報錯

               6.    嚴格模式 : 傳入 eval() 的程式碼不能在呼叫程式所在的上下文中宣告變數或定義函式,

                       非嚴格模式 :可以呼叫程式所在的上下文中宣告變數或定義函式,但是變數和函式的定義在eval()建立的新作用域中,這個作用域在eval()返回時棄用

              7.    嚴格模式 : 函式裡arguments物件擁有傳入函式值的靜態副本,

                      非嚴格模式 :arguments物件裡的陣列元素和函式引數都是指向同一個值的引用

              8.    嚴格模式 : delete後跟隨非法識別符號(變數,函式,函式引數)會丟擲語法錯誤異常,

                      非嚴格模式 :delete表示式什麼也沒做,返回false

              9.    嚴格模式 : 刪除一個不可配置的屬性將丟擲型別錯誤異常,

                      非嚴格模式 :刪除失敗,返回false

           10.    嚴格模式 : 在一個物件直接量中定義兩個或多個同名屬性將產生語法錯誤,

                                              函式宣告中存在兩個或多個同名的引數將產生語法錯誤

                      非嚴格模式 :不會報錯

            11.    嚴格模式 : 不允許用八進位制整數直接量(以0位字首)

                       非嚴格模式 :某些實現是允許的

            12.    嚴格模式 : 識別符號eval 和arguments當做關鍵字,他們的值是不能更改的,不能給這些識別符號賦值,也不能把他們宣告為變數,用做函式名,用做函式引數或用做catch塊的識別符號

                                    限制了對呼叫棧的檢測能力,arguments,caller,arguments。callee都會丟擲一個型別錯誤異常,