2021前端面试题-JS篇

JavaScript017

2021前端面试题-JS篇,第1张

```

当查找一个对象的某个属性时,会先从它自身的属性上查找,

如果找不到的话会从它的_proto_属性上查找,就是这个构造函数的prototype属性,

如果还没找到就会继续在_proto_上查找,直到最顶层,找不到则为undefined,

像这样一层一层去查找形成一个链式的称为原型链

```

new一个函数,中间发生了什么

1.开辟一个内存空间,也就是创建一个空对象,obj={}或obj=new Object()

2.将这个新对象的_proto_属性指向它构造函数的prototype

3.将构造函数this绑定为这个新对象,在空对象上挂在属性和方法(call或apply方式)

4.返回这个新对象

相同:都是改变函数上下文this指向

不同:bind返回的是一个函数,不会立即执行

         传参的不同 apply第二个参数为数组形式

         call apply都是对函数的直接调用

1.作为普通函数直接调用,this指向window

2.作为对象方法去调用的话,this指向调用它的这个对象

3.箭头函数,没有this,this取决于外层离它最近的非箭头函数的this

4.构造函数的this,指向创建这个构造函数的实例对象

1.词法作用域(静态作用域)

  js采用的就是词法作用域

  只有函数可以限定作用域

  函数允许函数访问外层作用域的变量

  函数在定义的时候决定了函数作用域,词法作用域关心函数在何处被定义

2.动态作用域

  函数在调用的时候决定了函数作用域,动态作用域关心函数在何处被调用

变量取值会到创建这个变量的函数作用域中去查找,如果找不到会向上查找,直到查找到全局作用域,这就形成了一个作用域链

1.节流

2.防抖

1.原型链继承

2.构造函数继承

3.组合继承(原型链继承+构造函数继承)

4.原型式继承

5.寄生继承

6.组合寄生继承

定义在一个函数内部的函数,这个内部函数有权访问外部函数作用域的变量

优点:

缺点:

js在运行中的任务,有一套收集,排队,执行的特殊机制,这种机制就是事件循环

遇到同步事件直接执行,遇到异步事件分为宏任务和微任务

如果微任务列表里有任务,先执行微任务再执行宏任务

块级作用域  暂时性死区  能否被修改

没有this  call apply方法修改this无效

没有prototype属性

没有argument

不能使用new  不能用作构造函数,会报错

持续更新中.......

js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤:

函数在运行的瞬间,生成一个活动对象(Active Object),简称AO

1.分析参数

2.分析变量声明:如var age或var age=23

3.分析函数的声明,如果有function name(){}把函数赋给AO.name ,覆盖上一步分析的值

例子1:

词法分析阶段:

例子2:

词法分析阶段:

a和b在词法分析时,区别:

词法作用域

所谓词法作用域是说,其作用域为在定义时(词法分析时)就确定下来的,而并非在执行时确定。白话就是在函数未执行前,函数执行的顺序已经被确定,而不是类似JAVA一样,是在执行前根本不知道执行顺序。

闭包

闭包就是能够读取其他函数内部变量的函数。

最大用处有2个:

1.读取函数内部变量

2.让这些变量的值始终保持在内存中

参考资料: http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

封装

其实就是用js模拟出类的写法,将你写成程序按照面向对象的思想去包装起来,方便调用

参考资料:http://www.cnblogs.com/sitemanager/p/3535904.html

http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html

原型

每个javascript对象都有一个原型对象(简称原型),这个原型是由该对象的构造函数所定义(javascript自动创建的),并且对象继承原型的所有属性和方法(函数)。

参考资料:http://www.cnblogs.com/FlyingCat/archive/2009/09/21/1570656.html

作用域链

Javascript作用域问题简单的可以用一句话来概括:两种类型的作用域( global, function)、三条作用域链。

理解两种三条前需要明白两点:

1) JavaScript是词法作用域,当一个函数被定义后,它的作用域链就作为函数的内部状态被保存了。

2) 在函数被定义时虽然作用域链确定了,但作用域链中的属性并没有确定。

两种类型的作用域:

1) 全局作用域 -- 变量为window对象的属性(默认浏览器环境中)。 <作用域链:window>

2) 函数作用域-- 变量查找的的顺序(即作用域链)<当前call object -- .... -- window object>

特殊的一条作用域链:

通过HTML属性定义的事件处理代码:<匿名函数的call object -- 当前节点 -- 父节点--...-- window object>

参考资料:http://www.laruence.com/2009/05/28/863.html

http://www.blueidea.com/tech/web/2007/4855.asp

http://www.educity.cn/java/679127.html