为什么 JS 是单线程, 而不是多线程
为什么 JS 是单线程, 而不是多线程
单线程是指 JavaScript 在执行的时候,有且只有一个主线程来处理所有的任务。
目的是为了实现与浏览器交互。
我们设想一下,如果 JavaScript 是多线程的,现在我们在浏览器中同时操作一个
DOM,一个线程要求浏览器在这个 DOM 中添加节点,
而另一个线程却要求浏览器删掉这个 DOM 节点,
那这个时候浏览器就会很郁闷,他不知道应该以哪个线程为准。
所以为了避免此类现象的发生,降低复杂度,JavaScript
选择只用一个主线程来执行代码,以此来保证程序执行的一致性。
请说出以下结果输出什么?为什么?
for(var i = 0; i < 5; i++) {
setTimeout(function(){
console.log(i)
}, 0)
}
答案:5个5
解释:异步代码需要等同步代码先执行,所以当异步定时器执行时,
同步的for循环已经循环完毕
请说出以下flag的结果?为什么?
function show(){}
function getName() { return ‘牛夫人’ }
var flag = show() || getName()
答案:flag值为’牛夫人’
解释:1.函数都会有一个默认的返回值undefined
2.逻辑或如果第一个值成立就直接返回第一个值,否则直接返回第二个值
请解释一下什么是重排与重绘?
重排:当改变dom结构的时候,就会从dom树开始从新渲染页面,这过程叫重排比如添加或者删除可见的DOM元素、元素尺寸改变、元素内容改变、浏览器窗口尺寸改变等等
重绘:当改变样式(不改变几何结构)的时候,它会从render树开始重新开始渲染页面,这过程叫重绘,比如改变颜色,透明等
怎么减少重排与重绘?
尽量避免操作DOM元素
避免多次修改dom结构或者css,集中处理,只引发一次重绘或者重排
请解释一下什么是防抖与节流
防抖(debounce)
总结:就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
节流(throttle)
总结:就是每次触发事件的隔间至少要大于等于n秒,不会重置计时
说一下call、apply、bind三者的作用 与 区别
作用:三者的作用都是可以改变函数的this指向(function对象自带的方法)
区别:1.call、apply会直接调用原函数,bind不会直接调用函数,而会拷贝一份返回一个新函数
call、bind传参时一个个传入,而apply是把所有参数放到一个数组中传入
JS严格模式的使用与作用
答案:在代码前面使用"use strict"就可以开启严格模式;
作用:
消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为;
消除代码运行的一些不安全之处,保证代码运行的安全;
提高编译器效率,增加运行速度;
为未来新版本的 Javascript 做好铺垫。
举例JS严格模式的特点
变量必须要通过修饰符进行声明
函数的参数不能有同名属性,否则报错
禁止 this 指向全局对象
增加了保留字(比如 protected 、 static 和 interface )
不能删除变量 delete prop
执行下面代码打印什么?为什么?
var a = {};
var b = {key: ‘b’};
var c = {key: ‘c’};
var d = [3,5,6];
a[b] = 123;
a[c] = 345;
a[d] = 333;
console.log(a[b]);
console.log(a[c]);
console.log(a[d]);
console.log(a[b]); // 打印:345
console.log(a[c]); // 打印:345
console.log(a[d]); // 打印:333
为什么:对象转化字符串会变成一个’[object Object]’
- 点赞
- 收藏
- 关注作者
评论(0)