阅读 78

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出来的调用了该方法的示例

五.补充

1.闭包在实际工作中的作用:闭包应用其实非常广泛,举个例子,可以拿来做数据隐藏,不被外界访问到我的数据进而导致数据被修改,只是提供设定好的API让外界有限的访问。

2.原型中this的指向问题,由于是原型调用某个方法,this指向原型很容易就找不到值,这个时候我们可以利用call或apply或bind方法,让this指向我们的对象。

六、手写简易bind函数

bind函数的手写还是比较简单,大体上从拿到指向的变量/函数和返回一个改变指向的函数两方面出发即可,需要注意的是bind本身只是改变this的指向,并没有执行该函数,所以还需要再调用这个函数才能执行,具体代码如下:

 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


作者:灰骑
链接:https://juejin.cn/post/7028748676021354532


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐