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,我们下次见!

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