面试-js

1.说说你对作用域链的理解
作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的。
2.创建ajax过程
(1)创建XMLHttpRequest对象,也就是创建一个异步调用对象.
(2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
(3)设置响应HTTP请求状态变化的函数.
(4)发送HTTP请求.
(5)获取异步调用返回的数据.
(6)使用JavaScript和DOM实现局部刷新.
ajax缺点
1、ajax不支持浏览器back按钮。 2、安全问题 AJAX暴露了与服务器交互的细节。 3、对搜索引擎的支持比较弱。 4、破坏了程序的异常机制。 5、不容易调试。
3.Javascript垃圾回收方法
标记清除(mark and sweep)
这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉 环境中的变量 以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了
引用计数(reference counting)
在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时 候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。
在IE中虽然JavaScript对象通过标记清除的方式进行垃圾回收,但BOM与DOM对象却是通过引用计数回收垃圾的, 也就是说只要涉及BOM及DOM就会出现 循环引用 问题。
4.js的继承方法和优缺点
https://www.cnblogs.com/Grace-zyy/p/8206002.html
1.原型链继承:让新实例的原型等于父类的实例。
缺点:原型上的属性是共享的,一个实例修改了原型属性,另一个实例的原型属性也会被修改
2.借用构造函数继承:用.call()和.apply()将父类构造函数引入子类函数
缺点:只继承了父类构造函数的属性,没有继承父类原型的属性。
3.组合继承(组合原型链继承和借用构造函数继承):
优点:结合了两种模式的优点,传参和复用;
缺点:调用了两次父类构造函数(耗内存)
4.原型式继承
5.寄生式继承
6.寄生组合式继承
5.对闭包的理解
闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量。
闭包有三个特性:
1.函数嵌套函数
2.函数内部可以引用外部的参数和变量
3.参数和变量不会被垃圾回收机制回收
DOM操作——怎样添加、移除、移动、复制、创建和查找节点。
1)创建新节点
createDocumentFragment() //创建一个DOM片段
createElement() //创建一个具体的元素
createTextNode() //创建一个文本节点
2)添加、移除、替换、插入
appendChild()
removeChild()
replaceChild()
insertBefore() //并没有insertAfter()
3)查找
getElementsByTagName() //通过标签名称
getElementsByName() //通过元素的Name属性的值(IE容错能力较强, 会得到一个数组,其中包括id等于name值的)
getElementById() //通过元素Id,唯一性
js延迟加载的方式有哪些
1.defer 属性 <script src=“test1.js” defer=“defer”></script>
2.async 属性<script src=“test1.js” async></script>
缺点:不能控制加载的顺序
3.动态创建DOM方式
4.使用jQuery的getScript方法

$.getScript("outer.js",function(){//回调函数,成功获取文件后执行的函数  
      console.log("脚本加载完成")  
});

5.使用setTimeout延迟方法
6.让JS最后加载
哪些操作会造成内存泄漏?
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
javascript对象的几种创建方式
1,工厂模式
2,构造函数模式
3,原型模式
4,混合构造函数和原型模式
5,动态原型模式
6,寄生构造函数模式
7,稳妥构造函数模式
null和undefined的区别?
null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
undefined表示”缺少值”,就是此处应该有一个值,但是还没有提供。
事件捕获和事件冒泡机制
事件捕获
当一个事件触发后,从Window对象触发,不断经过下级节点,直到目标节点。在事件到达目标节点之前的过程就是捕获阶段。所有经过的节点,都会触发对应的事件
事件冒泡
当事件到达目标节点后,会沿着捕获阶段的路线原路返回。同样,所有经过的节点,都会触发对应的事件,stopPropagation(),preventDefault()
事件代理
本来加在子元素身上的事件,加在了其父级身上。
优点:
提高性能:每一个函数都会占用内存空间,只需添加一个事件处理程序代理所有事件,所占用的内存空间更少。
动态监听:使用事件委托可以自动绑定动态添加的元素,即新增的节点不需要主动添加也可以一样具有和其他元素一样的事件。
attribute和property的区别是什么?
attribute是dom元素在文档中作为html标签拥有的属性;
property就是dom元素在js中作为对象拥有的属性。
图片懒加载的原理
页面加载时,将图片加载的链接,保存在img标签的自定义属性中,src属性为空,并监听窗口的scroll事件。当img标签出现在可视视口中时,利用js将图片加载编写填写至src属性中,实现动态加载图片。
优点:这样做能防止页面一次性向服务器发送大量请求,导致服务器响应面,页面卡顿崩溃等。
防抖和节流
防抖和节流是针对响应跟不上触发频率这类问题的两种解决方案。
防抖:当事件快速连续不断触发时,并在给定时间过去之后,或者连续事件完全触发完成之后,动作只会执行一次。
节流:当达到了一定的时间间隔就会执行一次;可以理解为是缩减执行频率

//防抖函数
function debounce(fn, time){
 return function(){
  var context = this;
  clearTimeout(timeId);
  timeId = setTimeout(function(){
   fn.apply(context, arguements);
  }, time);
 };
}
//节流函数
function throttle(fn,time){
 var last = 0;
 return function(){
  var context = this;
  var now = Date.now();
  if (now - last >= time){
   fn.apply(this, arguments);
   last = now;
  }
 };
}

事件循环
https://blog.csdn.net/tzllxya/article/details/92674042
高阶函数是什么?有什么用?
一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
高阶函数广泛应用于js中,例如map、sort、setTimeout等

发布了19 篇原创文章 · 获赞 0 · 访问量 274

猜你喜欢

转载自blog.csdn.net/qq_37636738/article/details/102826078