Javascript基礎知識體系化學習總結(三)作用域和閉包

Javascript基礎知識體系化學習總結(三)作用域和閉包

一、作用域
1.作用域是一個變量的合法使用範圍。
2.作用域分爲全局作用域(在哪裏都能使用該變量,如document、window)、函數作用域(只能在當前函數使用該變量)、塊級作用域(由let/const搭配{}構成)。

二、自由變量
1.自由變量是指在當前作用域沒有定義但是被使用了。
2.自由變量的查找規則是在當前作用域向上一層層查找。

三、閉包
1.閉包有兩種情況:函數作爲返回值返回或者函數作爲參數被傳入。
2.閉包中所有自由變量的值是在函數定義的地方,向上級作用域查找!不是在執行的地方!

四、this
1.this的指向分爲五種情況:
(1)作爲普通函數被調用 // 指向window
(2)在apply / call / bind中調用 // 指向它們指定的參數
(3)作爲對象的方法被調用 // 指向當前對象
(4)作爲箭頭函數被調用 // 箭頭函數本身沒有作用域,this的指向需要在箭頭函數的上級作用域去找
(5)在class中被使用 // 指向該class new出來的調用了該方法的示例

五、手寫bind函數
bind函數的手寫還是比較簡單,大體上從拿到指向的變量/函數和返回一個改變指向的函數兩方面出發即可,需要注意的是bind本身只是改變this的指向,並沒有執行該函數,所以還需要再調用這個函數才能執行,具體代碼如下:

<!DOCTYPE html>
<html>
<head>
	<title>手寫bind函數</title>
</head>
<body>
<script type="text/javascript">
	Function.prototype.bind1 = function () { // 不需要傳入arguments
		const args = Array.prototype.slice.call(arguments) // 首先拿到所有的參數並且轉換成數組
		const t = args.shift() // 拿到傳入的數組的第一項作爲bind要綁定的this
		const self = this // 這個是區分調用者的this
		return function () {
			return self.apply(t,args) 
			// 讓調用者調用這個apply,至於爲什麼包在一個函數裏返回是因爲bind本身只是指定this,並不執行
		}
	}
	function fn(a,b,c) { // 隨便定義一個函數
		console.log('this是:',this)
		console.log(a,b,c);
	}
	const fn1 = fn(1,2,3) // 打印出window爲this和1 2 3
 	const fn2 = fn.bind1([1],1,2,3)() // 打印出[1]爲this,1 2 3
</script>
</body>
</html>

另外補充兩點:
1.閉包在實際工作中的作用:閉包應用其實非常廣泛,舉個例子,可以拿來做數據隱藏,不被外界訪問到我的數據進而導致數據被修改,只是提供設定好的API讓外界有限的訪問。
2.原型中this的指向問題,由於是原型調用某個方法,this指向原型很容易就找不到值,這個時候我們可以利用call或apply或bind方法,讓this指向我們的對象。

好了,javascript的第三個模塊大概就是這些內容了,我會將它分爲11個模塊然後13篇文章左右把它講完(有的模塊內容多會範圍上下期大概。。。),學完這些模塊相信大家對基礎的js會有一個比較體系化的認識,那麼大家加油,我是O5,我們下次見!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章