嚴格模式
- js有兩中開發模式:
非嚴格模式(默認)+嚴格模式(“ues strict”)
- 嚴格模式:會進行更嚴格的代碼檢查
- 區別:
以前可以的特性在嚴格模式下可能被禁止使用
以前可以使用的代碼方式,在嚴格模式下會直接報錯
- 開啟嚴格模式:
- 字符串命令“ues strict”
- 位置:當前作用域的最頂端
- 兼容性問題:
- 嚴格模式不存在兼容的問題,如果當前的瀏覽器支持嚴格模式,那么掃描到命令的時候會開啟嚴格模式檢查,如果不支持則直接忽略。
- 使用建議:寫代碼的時候全部開啟嚴格模式
- 在嚴格模式下的使用注意點:
- 1.所用的變量必須使用var聲明(否則會報錯)
- 2.禁止使用八進制()
var num = 033 //數值以0開頭,是以八進制的方式來處理
直接報錯
var num = 0x33 //數值以0x開頭,是以十六進制的方式來處理
不會報錯
在嚴格模式下,不能刪除全局變量(直接報錯)
在默認情況下,可以刪除全局變量,會靜默失敗(報錯卻不顯示)
- 5.不能在if語句中聲明函數
- 6.函數的形參不能出現同名的情況
- 7.不能使用callee||caller
- 8.不能使用eval和arguments作為標識符(變量和函數的名稱)
- 9.修正了this的指向
function func(){
console.log(this);
}
func();
默認情況下,this指向的是window,嚴格模式下this指向的是undefind
在默認情況下,如果函數內部形參被重新設置,那么arguments也會跟著改變
在嚴格模式情況下,如果函數內部形參被重新設置,那么arguments不會被改變,他們是相互獨立的。
值類型的數據作為函數的參數
引用類行的數據作為函數的參數
作用域
- “ues strict”的位置:當前作用域的最頂端
(只會對當前作用域有影響)
- js中的作用域:
- script:全局作用域
- 函數內部:局部作用域
- 作用域:
- 概念:變量或者是函數起作用的范圍。
- js的作用域:
- js本身沒有塊級作用域
- js中只有函數可以創建作用域
- js本身是詞法作用域(with||eval)
- 詞法作用域:當代碼寫好之后,某個變量的作用域就已經確定了
- 訪問規則:
1.單向性的(單向鏡)內部的作用域可以訪問外層的作用域空間,反過來卻不行
2.在訪問變量的時候,在先前作用域中查找,如果找不到那么就在上級作用域中查找,重復這個過程
3.在分析輸出的時候,需要考慮到變量和函數聲明的提升
- 動態作用域:變量的作用域在代碼運行之前是不確定的,只有在代碼執行的時候才會根據上下文確定
var demo = "測試";
function fi(){
var demo = "demo";
f2();
}
function f2(){
console.log(demo);
}
f2() //測試
f1() //測試
- js代碼的執行
- 編譯語言
- 腳本語言(解釋性的語言)
1.預先解析階段
變量和聲明的提升
2.具體執行的代碼
- js變量和函數聲明的提升
- 注意點:
變量和變量同名,后面的變量會把前面的變量覆蓋
函數和函數同名,后面覆蓋前面
變量和函數同名,函數聲明會正常的提升,而變量的聲明可以認為被忽略了。
1.在執行代碼之前,會把所有的變量和函數聲明進行提升
2.在提升的時候,變量和函數生明的提升是分作用域的,只能提升到當前作用域的頂端。
3.內層作用域中的變量聲明并不會覆蓋外層作用域的同名變量
- 函數表達式的提升
- 如果是函數表達式提升,那么在提升的時候僅僅只會把聲明的部分(var fun)提升到當前作用域的頂端
- 作用域鏈
- 在JS中函數可以創建作用域,在函數內部又可以聲明函數,-->。
1.在訪問變量的時候,總是先在自己的作用域中查找
2.如果沒有就向上一級查找,找到的話直接使用,沒有繼續查找
3.直到最外層的全局作用域
- 作用域數量:函數的個數加1
- 內層的作用域可以訪問外層的作用域,外層的作用域不可以訪問內層的
- 相同的作用域可以相互訪問
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。