#1.闭包是什么?
闭包就是能过读取其他内部变量的函数。
闭包指的是有权访问另一个函数作用域找中变量的函数,创建闭包的常见的方式是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用域链。
闭包的特性
函数内嵌套函数。
内部函数可以引用外部的参数及变量
参数和变量不会被垃圾机制回收
谈谈对闭包的理解
使用闭包就是避免全局变量的污染,但是缺点是闭包会消耗内存,会增大内存的使用量,容易导致内存的泄露。
闭包的好处
一个是可以读取函数内部的变量
另一个是可以让这些变量一直保存的内存中
闭包的用处
是可以封装对象的私有变量和私有的方法
#2.谈谈你对作用域的理解
作用域的作用是保证执行环境中的有权访问的变量和函数是有序的,并且变量只能由上往下访问,直到访问到window对象为止。
#3.JavaScript原型,原型链是什么?各自都有什么特点?
每个对象都是会初始化一个属性,就是原型(prototype),
当我们访问这个原型的属性的时候,如果不存在这个属性,就会在prototype这个属性里一直找下去,这个就是原型链的概念。
JavaScript的对象是通过引用来传递的,我们创建的每一个实体的对象并没有一份属于自己的原型,当我们修改原型是,他也会随之改变。
当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性,如果没有的,查找就会他的Prototype对象是否有这个属性,如此递推下去,检索一直到Object内建对象
#4.什么是事件代理?
事件代理又称为事件委托,是JavaScript常用绑定事件的技巧。
事件代理就是把原本需要绑定在的事件委托给父元素,交给父元素来监听。
他的原理是Dom事件的事件冒泡,使用事件委托的好处是可以提升性能。可以减少资源的占用,对新增的子对象无需在进行事件绑定。
#5.JavaScript如何实现继承?
构造继承,原型继承,实例继承,拷贝继承。
原型的prototype机制或者apply ,call方法比较简单,使用构造函数和原型混合的方式
#6.谈谈对this对象的理解
this指向的是函数的直接调用者
如果含有new关键字,则this指向的是new
如果在一个事件中,this指向的是这个事件的对象,
特殊一点的是IE里的attachEvent中的this始终指向的是window。
#7.什么是事件模型?
事件的发生经历三个阶段:捕获,目标,冒泡
冒泡型事件:使用事件冒泡是,子级元素先触发,父级元素后触发
捕获型事件:使用事件冒泡是,父级元素先触发,子级元素后触发
DOM事件流: 支持以上两种方式的事件。
阻止冒泡:在W3c中,使用stopPropagation()方法;在IE下设置cancelBubble = true
阻止捕获:阻止事件的默认行为,例如click-<a>。的后跳转在W3c中,使用preventDefault()方法,在IE下设置window.event.returnValue = false
#8.new操作符具体都干了些什么?
创建一个空对象,并且this变量引用该对象,同时继承该对象的原型
状语从句:属性被方法加入到this引用的对象中
创建³³新的对象由this所引用,并且最后隐式的返回this
#9.ajax的原理
ajax的原理简单的来说,就是这服务器与用户之间加了一个引擎(ajax),听过XMLREQUEST对象来向服务器发送ajax的异步请求,从服务器获取数据之后,返回到JavaScript来进行dom操作。
/** 1. 创建连接 **/
var xhr = null;
xhr = new XMLHttpRequest()
/** 2. 连接服务器 **/
xhr.open('get', url, true)
/** 3. 发送请求 **/
xhr.send(null);
/** 4. 接受请求 **/
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
success(xhr.responseText);
} else {
/** false **/
fail && fail(xhr.status);
}
}
}
ajax 的优缺点
优点:
异步的请求模式,提升了用户的体验。
优化了浏览器与服务器之间的数据传输。
ajax在客户端运行,减少了服务器的压力
ajax可以实现局部刷新
缺点:
ajax暴露了与服务器交互的环节
不容易调试
对搜索引擎的支持比较弱
#10.如何解决跨域问题?
1.JSONP跨域
var script = document.createElement('script');
script.type = 'text/javascript';
// 传参并指定回调执行函数为onBack
script.src = 'http://www.....:8080/login?user=admin&callback=onBack';
document.head.appendChild(script);
// 回调执行函数
function onBack(res) {
alert(JSON.stringify(res));
}
2.nginx的代理跨域
3.nodejs的中间件跨域
4.后端在头部信息里面设置安全的域名
#11.模块化开发怎么做? 立即执行函数,不暴露私有成员
var module1 = (function(){
var _count = 0;
var m1 = function(){
//...
};
var m2 = function(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();
#12.异步加载js 的方式有哪些?
async
创建script,插入dom中,然后返回callback
defer ,只支持IE
#13.哪些操作可以导致内存泄露?
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在
setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏
闭包使用不当
#14. XML和JSON的区别?
数据体积方面
json 相对于xml的来讲,体积小,传递的速度更快
数据交互方面
json 与 JavaScript 的交互更方便,更加好处理,更好的数据交互
数据描述方面
json 比xml的数据描述性差
传输速度方面
json的速度比xml的快
#15.谈谈对webpack 的理解?
webpack是一种模块化的打包工具,可以是使用webpack管理依赖,并编译模块输出的所需的文件,
它能够很快的,打包,管理web开发的html,css,JavaScript以及各种静态的文件,让开发更规范。
可以实现类似:js代码的压缩、合并;js兼容性的处理(es6\es7----es5);处理预处理的css,
还可以解决css兼容性问题 -webkit -moz- css3新特性 css前缀;可以实现图片的编码 base64 进行内嵌;.......
#16.说说你对cmd和common.js 的理解
commonjs是服务端模块化的规范,node.js 采用了规范,commonjs的规范加载模块是同步的,
只有加载完成,才能执行后面的操作,amd规范是非同步的,允许指定回调函数,AMD推荐的风格通过返回一个对象做为模块对象,CommonJS的风格通过对module.exports或exports的属性赋值来达到暴露模块对象的目的
#17.常见的web安全与防护原理
sql注入原理
就是把sql语句的命令插入到web表单里递交或者输入域名或页面请求的查询字符串,最终达到欺骗服务器的执行恶意的sql指令
XSS防范方法
首先代码里对用户输入的地方和变量都需要仔细检查长度和对”<”,”>”,”;”,”’”等字符做过滤;其次任何内容写到页面之前都必须加以encode,避免不小心把html tag 弄出来。这一个层面做好,至少可以堵住超过一半的XSS 攻击
XSS与CSRF有什么区别吗?
XSS是获取信息,不需要提前知道其他用户页面的代码和数据包。CSRF是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。要完成一次CSRF攻击,受害者必须依次完成两个步骤
登录受信任网站A,并在本地生成Cookie
在不登出A的情况下,访问危险网站B
CSRF的防御
服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数
通过验证码的方法
#18.用过哪些设计模式?
工厂模式:解决了重复实例化的问题,
消除了对象间的耦合,但是无法解决对象识别的方式
构造函数模式:既解决了重复实例化的问题,有解决了对象识别的问题,
与工厂模式的不同之处在于,直接将属性与方法赋值给this对象
#19.为什么要有同源限制?
同源策略:协议,端口,域名相同
同源策略的限制本质性是一个安全的协议,主要是为了防范密码的安全的登录保证密码的安全。
#20.offsetWidth/offsetHeight, clientWidth/clientHeight 与scrollWidth/scrollHeight的区别?
offsetWidth/offsetHeight返回值包含content + padding +border,效果与e.getBoundingClientRect()相同
clientWidth/clientHeight返回值只包含content + padding,如果有滚动条,也不包含滚动条
scrollWidth/scrollHeight返回值包含content + padding + 溢出内容的尺寸