cvte面试题——关于this指向、闭包及原型链上属性初始化的问题
发布日期:2021-05-12 21:18:15 浏览次数:19 分类:精选文章

本文共 1569 字,大约阅读时间需要 5 分钟。

cvte面试题——关于this指向和闭包的问题


一、关于this指向

首先,我们通过邹佳乐学长的一个this指向问题来先检测一下自己对于this的掌握程度。

let obj2 = {       name: 'obj2'}const obj = {       name: 'obj',    say1() {           console.log(this.name)    },    obj1: {           name: 'obj1',        say2() {               console.log(this.name);        }    },    say3() {           const fn = () => {               console.log(this.name);        }        fn()    },    say4() {           const fn = function () {               console.log(this.name);        }        fn()    },    say5() {           const fn = () => {               console.log(this.name);        }        fn.call(obj2)    },    say6() {           const fn = function () {               console.log(this.name);        }        fn.call(obj2)    }}let a = obj.say1let b = obj.obj1.say2a() //undefinedb() //undefinedobj.say1() //objobj.obj1.say2() //obj1obj.say3()//objobj.say4()//undefinedobj.say5()//objobj.say6()//obj2

接下来是cvte中有关于this指向的题,

关键点:这里并没有形成闭包

总结:

1、对于普通函数来说,this->window
2、全局作用域下,this -> window
3、对于对象来说,谁调用函数谁就是this
4、new 的方式,this永远被绑定在实例上
5、箭头函数本身是没有this,继承外层上下文绑定的this(包裹箭头函数的第一个普通函数的this)
6、箭头函数使用bind,call,this无效
7、bind/call/apply 这些改变上下文的 API 了,对于这些函数来说,this 取决于第一个参数,8、如果第一个参数为空,那么就是 window
9、不管我们给函数 bind 几次,fn 中的 this 永远由第一次 bind 决定


二、关于闭包的有趣问题

关键点:这里形成了闭包


三、原型链上属性初始化的问题

在构造函数中,通过this.xxx所访问的属性xxx,并不会查找原型链,

若对象本身没有属性xxx,则会直接添加一个属性,不会再到原型链中添加。

如上面的b = new B(789)中,先通过查找原型链发现value确实存在,然后直接在b的属性中,即b.value = 789,而b.__proto__.value=456,并不会有影响。

通过谷歌浏览器进行断点调试证明:

断点处:31行。
当执行完成33行时,从这里即可说明上面的分析是正确的。
在这里插入图片描述

继续执行完34行代码时:b.__proto__、b2.__proto__中的属性同时被修改。

在这里插入图片描述

上一篇:使用vue-lazyloader实现图片的懒加载
下一篇:VueCLI2以及CLI3创建项目的过程

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月16日 19时15分44秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章