前端面试题:同步和异步的区别?

JavaScript018

前端面试题:同步和异步的区别?,第1张

举个例子:普通B/S模式(同步)AJAX技术(异步)

同步:提交请求 >>等待服务器处理 >>处理完毕返回,这个期间浏览器不能干任何事。

异步:请求通过事件触发 >>服务器处理(这时浏览器仍然可以运作其它事情) >>处理完毕

普通B/S模式:浏览器/服务器模式。

Ajax技术:大概意思浏览器可以发出HTTP请求与接收HTTP响应

同步是阻塞模式,异步是非阻塞模式。

我的理解:

同步是指两个线程的运行是相关的,其中一个线程要阻塞等待另一个线程的运行。

异步是两个线程毫无相关,自己运行自己的。

同步:发送方付出数据后,等待接收方响应后才发下一个数据包的通讯方式。

异步:发送方发出数据后,不等的接收方的响应,接着发送下一个数据包的通讯方式。

我的理解

同步: 对讲机 。A和B通话,A等待B的回应,A再继续说。

A:“呼叫B哥,呼叫B哥... 听到请回答?”

B:“收到!收到!完毕”

A:“你妈妈喊你回家吃饭,完毕。”

B:“... 收到。通话结束”

异步:我用qq或者微信跟朋友聊天 发消息 聊天。

参考:

http://blog.chinaunix.net/uid-21411227-id-1826898.html

js的同步和异步问题通常是指ajax的回调,如果是同步调用,程序在发出ajax调用后就会暂停,直到远程服务器产生回应后才会继续运行。而如果是异步调用,程序发出ajax调用后不会暂停,而是立即执行后面的代码,服务器返回信息后会自动触发回调函数进行处理。相比较而言,异步调用的性能最佳,程序不会出现卡顿的现象,而同步调用则通常用于需要立即获得结果并实时处理的情况。

打个比方:假如你想让四个手下分别去执行四个不同的任务,如果用“同步”的方法,就要先让第一个人去执行任务,这期间你和另外三个手下就呆呆地等,什么也不干,直到第一个人完成任务回来报告后再让第二个人去执行任务,依此类推;而如果用“异步”的方法,就可以把四个手下同时派出去执行任务,然后自己就可以去喝酒唱歌泡妞了,手下完成任务后只需要用手机向你汇报结果即可。

```

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

如果找不到的话会从它的_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  不能用作构造函数,会报错

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