js嚴格模式下的總結

所謂嚴格模式其實就是一個不會賦值給任何變量的字符串 「use strict」
若是在全局做用域下 給出這個提示,那整個腳本將採用嚴格模式。也能夠只在函數中打開嚴格模式windows

1.嚴格模式下沒有全局變量

a="test"app

嚴格模式下會報錯,非嚴格模式下正常函數

2.刪除變量

var 有三種聲明的情形this

  • var 聲明的全局變量
  • var 聲明的局部變量
  • eval()中聲明的全局變量

第一種和第二種狀況是沒法用 delete刪掉的。
首先第一種狀況聲明的全局對象雖然是windows的屬性,但這個屬性的configurable=false 所以是沒法刪除的
第二種狀況 局部變量更不行了,連依附的對象是誰都不知道,怎麼刪除code

第三種狀況eval()稍後會說到。對象

迴歸正題。也就是說非嚴格模式下,能夠刪除變量,可是會失敗返回false.
嚴格模式下刪除變量會報錯。作用域

3.對象

在下列狀況下操做對象會報錯字符串

  1. 爲只讀屬性賦值會報錯
  2. 對不可配置的屬性使用delete 會報錯
  3. 爲不可擴展的對象添加屬性會報錯
  4. 在使用對象字面量的時候,屬性名必須惟一。好比
var person={
   name:"1",
    name:"2"
}

非嚴格模式下會默認取值第二個,嚴格模式下會報錯。io

4.函數

嚴格模式要求函數參數名稱必須惟一console

function(n,n){
   // todo
}

在非嚴格模式下,這個函數聲明不會報錯,經過參數名只能訪問到第二個參數,第一個參數得經過arguments去訪問。
arguments在兩種模式下也有所不一樣
在非嚴格模式下,修改命名參數的值會反映到arguments對象中,在嚴格模式下兩個值是獨立的。
淘汰了 arguments.callee(引用函數自己),arguments.caller(引用調用函數)。
嚴格模式下函數名不能使用js保留字
**嚴格模式下只能在腳本的頂級和在函數內部聲明函數,在if語句中聲明函數會致使語法錯誤。
**

if(true){
   function(){
     // 嚴格模式下報錯
}
}

5.this

在非嚴格模式下使用函數的apply(),call(),傳入null 或者undefined值會被轉換爲全局對象。在嚴格模式下,函數的this始終是指定的值,不管指定的是什麼值。

var a="1";
function test(){
  console.log(this.a)
}
test.call(null) 在非嚴格模式下會輸出1,嚴格模式下this就指代的就是null,null沒有a屬性,就會報錯。

一會回來補充點別的

相關文章
相關標籤/搜索