WEB前端面试题的记录(二)javascript
一、一次完整的HTTP事务是怎样的一个过程:
基本流程:html
域名解析前端
发起TCP的3次握手vue
创建TCP链接后发起http请求java
服务器端响应http请求,浏览器获得html代码面试
浏览器解析html代码,并请求html代码中的资源编程
浏览器对页面进行渲染呈现给用户跨域
二、JSONP是什么?它是如何实现跨域的?为何它能够实现跨域?
JSONP(JSON with Padding)是一个非官方的协议,它容许在服务器端集成Script tags返回至客户端,经过javascript callback的形式实现跨域访问。
因为同源策略的限制,XmlHttpRequest只容许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,能够经过script标签实现跨域请求(由于同源策略不阻止动态脚本插入,而且将脚本看做是从提供 Web 页面的域上加载的),而后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。浏览器
三、闭包:函数能被外部调用到,则该做用连上的全部变量都会被保存下来。
做用:①能够读取函数内部的变量;②至关于划出了一块私有做用域,避免数据污染;③让变量始终保存在内存中
使用全局变量被认为是很差的习惯,并且容易形成错误而且维护成本较高,因此js能够采用闭包的方式读取函数的内部变量。可是若是大量使用闭包就会形成过多的变量始终保存在内存中,会形成内存泄漏。服务器
四、模块化编程
①AMD(异步模块定义) requirejs
defined(id,deps,factory)
require([dependency],function(){})
异步加载,浏览器不会失去响应
它指定的回调函数,只有前面的模块都加载完成后,才会运行,解决了依赖性问题
②CMD(通用模块定义) seajs
模块定义方式和模块加载时机处理不一样
defined(id,deps,factory)
function(require,exports,module)
module.exports = ______;
③区别:AMD依赖前置,在定义模块的时候就要声明其依赖的模块;CMD就近依赖,只有在用到哪一个模块的时候再去require;
五、JS继承与原型问题
Js全部的函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型。每个对象都有原型,在浏览器中它体如今一个隐藏的 proto 属性上。
当一个对象须要调用某个方法时,它回去最近的原型上查找该方法,若是没有找到,它会再次往下继续查找。这样逐级查找,一直找到了要找的方法。 这些查找的原型构成了该对象的原型链条。原型最后指向的是null。咱们说的原型继承,就是将父对像的方法给子类的原型。子类的构造函数中不拥有这些方法和属性。
六、一个页面从URL到加载显示完成,都发生了什么?
①经过DNS将该地址解析成IP地址;
②发起网络链接,进行http协议会话:客户端发送报头(请求报头),服务端回馈报头(响应报头)
③返回一个页面(根据页面上的外链的URL从新发送请求获取)
④接收文件完毕,对加载到的资源进行语法解析,以及相应的内部数据结构(网页渲染)
七、队列、堆、栈的区别?
队列是先进先出:就像一条路,有一个入口和一个出口,先进去的就能够先出去。而栈就像一个箱子,后放的在上边,因此后进先出。堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对通常内存的访问没有区别。
栈(Stack)是操做系统在创建某个进程时或者线程为这个线程创建的存储区域。在编程中,例如C/C++中,全部的局部变量都是从栈中分配内存空间,实际上也不是什么分配,只是从栈顶向上用就行,在退出函数的时候,只是修改栈指针就能够把栈中的内容销毁,因此速度最快。
堆(Heap)是应用程序在运行的时候请求操做系统分配给本身内存,通常是申请/给予的过程。因为从操做系统管理的内存分配因此在分配和销毁时都要占用时间,因此用堆的效率低的多!可是堆的好处是能够作的很大,C/C++对分配的Heap是不初始化的。
在Java中除了简单类型(int,char等)都是在堆中分配内存,这也是程序慢的一个主要缘由。可是跟C/C++不一样,Java中分配Heap内存是自动初始化的。在Java中全部的对象(包括int的wrapper Integer)都是在堆中分配的,可是这个对象的引用倒是在Stack中分配。也就是说在创建一个对象时从两个地方都分配内存,在Heap中分配的内存实际创建这个对象,而在Stack中分配的内存只是一个指向这个堆对象的指针(引用)而已。
八、什么是线程?进程和线程的关系是什么?
线程可定义为进程内的一个执行单位,或者定义为进程内的一个可调度实体。 在具备多线程机制的操做系统中,处理机调度的基本单位不是进程而是线程。一个进程能够有多个线程,并且至少有一个可执行线程。
线程和进程的关系:
(1)线程是进程的一个组成部分.
(2)进程的多个线程都在进程地址空间活动.
(3)系统资源是分配给进程的,线程须要资源时,系统从进程的资源里分配给线程.
(4)处理机调度的基本单位是线程.
九、CSS3中的transform属性和transition属性?
transform:
功能:使元素变形的属性,其配合rotate(旋转角度)、scale(缩放倍数)、skew(扭曲元素)等参数一块儿使用
语法:
transform:rotate(旋转角度);//正数为顺时针、负数为逆时针;
transform:rotate(30deg);//顺时针旋转30度
transform:rotate(-20deg);//逆时针旋转20度
transform:scale(缩放倍数);
transform:scale(1.20);//放大1.2倍
transition:
功能:设置元素由样式一变为样式二所须要的一些变化效果
语法:transition: property duration timing-function delay ;
值 描述
transition-property 规定设置过渡效果的 CSS 属性的名称。
transition-duration 规定完成过渡效果须要多少秒或毫秒。
transition-timing-function 规定速度效果的速度曲线。
transition-delay 定义过渡效果什么时候开始。
十、什么是MVVM框架?MVVM是Model-View-ViewModel的简写。MVVM 是 Web 前端一种很是流行的开发模式,利用 MVVM 可使咱们的代码更专一于处理业务逻辑而不是去关心 DOM 操做。目前著名的 MVVM 框架有 vue, avalon, angular 等,这些框架各有千秋,可是实现的思想大体上是相同的:数据绑定 + 视图刷新。跟MVC同样,主要目的是分离视图(View)和模型(Model)。View能够独立于Model变化和修改,一个ViewModel能够绑定到不一样的"View"上,当View变化的时候Model能够不变,当Model变化的时候View也能够不变。在MVVM中,数据是核心,因为VIewModel与View之间的双向绑定,操做了ViewModel中的数据(固然只能是监控属性),就会同步到DOM,咱们透过DOM事件监控用户对DOM的改动,也会同步到ViewModel。MVVM框架的优势:(1)方便测试在MVC下,Controller基本是没法测试的,里面混杂了个各类逻辑,并且分散在不一样的地方。有了MVVM咱们就能够测试里面的viewModel,来验证咱们的处理结果对不对。(2)便于代码的移植能够把一些视图逻辑放在一个ViewModel里面,让不少view重用这段视图逻辑。好比iOS里面有iPhone版本和iPad版本,除了交互展现不同外,业务逻辑的model是一致的。这样,咱们就能够以很小的代价去开发另外一个app。(3)独立开发开发人员能够专一于业务逻辑和数据的开发(ViewModel),设计人员能够专一于页面设计,使用Expression Blend能够很容易设计界面并生成xml代码。