闭包就是可以读取其余函数内部变量的函数javascript
闭包是指有权访问另外一个函数做用域中变量的函数,建立闭包的最多见的方式就是在一个函数内建立另外一个函数,经过另外一个函数访问这个函数的局部变量,利用闭包能够突破做用链域html
闭包的特性:java
说说你对闭包的理解webpack
使用闭包主要是为了设计私有的方法和变量。闭包的优势是能够避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易形成内存泄露。在js中,函数即闭包,只有函数才会产生做用域的概念web
闭包 的最大用处有两个,一个是能够读取函数内部的变量,另外一个就是让这些变量始终保持在内存中ajax
闭包的另外一个用处,是封装对象的私有属性和私有方法正则表达式
好处:可以实现封装和缓存等;sql
坏处:就是消耗内存、不正当使用会形成内存溢出的问题数据库
使用闭包的注意点json
因为闭包会使得函数中的变量都被保存在内存中,内存消耗很大,因此不能滥用闭包,不然会形成网页的性能问题,在IE中可能致使内存泄露
解决方法是,在退出函数以前,将不使用的局部变量所有删除
做用域链的做用是保证执行环境里有权访问的变量和函数是有序的,做用域链的变量只能向上访问,变量访问到window
对象即被终止,做用域链向下访问变量是不被容许的
简单的说,做用域就是变量与函数的可访问范围,即做用域控制着变量与函数的可见性和生命周期
每一个对象都会在其内部初始化一个属性,就是prototype
(原型),当咱们访问一个对象的属性时
若是这个对象内部不存在这个属性,那么他就会去prototype
里找这个属性,这个prototype
又会有本身的prototype
,因而就这样一直找下去,也就是咱们平时所说的原型链的概念
关系:instance.constructor.prototype = instance.__proto__
特色:
JavaScript
对象是经过引用来传递的,咱们建立的每一个新对象实体中并无一份属于本身的原型副本。当咱们修改原型时,与之相关的对象也会继承这一改变当咱们须要一个属性的时,Javascript
引擎会先看当前对象中是否有这个属性, 若是没有的
就会查找他的Prototype
对象是否有这个属性,如此递推下去,一直检索到 Object
内建对象
事件代理(Event Delegation
),又称之为事件委托。是 JavaScript
中经常使用绑定事件的经常使用技巧。顾名思义,“事件代理”便是把本来须要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是能够提升性能
能够大量节省内存占用,减小事件注册,好比在table
上代理全部td
的click
事件就很是棒
能够实现当新增子对象时无需再次对其绑定
构造继承
原型继承
实例继承
拷贝继承
原型prototype
机制或apply
和call
方法去实现较简单,建议使用构造函数与原型混合方式
function Parent(){ this.name = 'wang'; } function Child(){ this.age = 28; } Child.prototype = new Parent();//继承了Parent,经过原型 var demo = new Child(); alert(demo.age); alert(demo.name);//获得被继承的属性 }
this
老是指向函数的直接调用者(而非间接调用者)new
关键字,this
指向new
出来的那个对象this
指向触发这个事件的对象,特殊的是,IE
中的attachEvent
中的this
老是指向全局对象Window
冒泡型事件:当你使用事件冒泡时,子级元素先触发,父级元素后触发
捕获型事件:当你使用事件捕获时,父级元素先触发,子级元素后触发
DOM
事件流:同时支持两种事件模型:捕获型事件和冒泡型事件
阻止冒泡:在W3c
中,使用stopPropagation()
方法;在IE下设置cancelBubble = true
阻止捕获:阻止事件的默认行为,例如click - <a>
后的跳转。在W3c
中,使用preventDefault()
方法,在IE
下设置window.event.returnValue = false
建立一个空对象,而且 this
变量引用该对象,同时还继承了该函数的原型
属性和方法被加入到 this
引用的对象中
新建立的对象由 this
所引用,而且最后隐式的返回 this
Ajax
的原理简单来讲是在用户和服务器之间加了—个中间层(AJAX
引擎),经过XmlHttpRequest
对象来向服务器发异步请求,从服务器得到数据,而后用javascrip
t来操做DOM
而更新页面。使用户操做与服务器响应异步化。这其中最关键的一步就是从服务器得到请求数据
Ajax
的过程只涉及JavaScript
、XMLHttpRequest
和DOM
。XMLHttpRequest
是aja
x的核心机制
// 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 { // fail fail && fail(xhr.status); } } }
ajax 有那些优缺点?
优势:
Ajax
在客户端运行,承担了一部分原本由服务器承担的工做,减小了大用户量下的服务器负载。Ajax
能够实现动态不刷新(局部刷新)缺点:
AJAX
暴露了与服务器交互的细节。jsonp
、 iframe
、window.name
、window.postMessage
、服务器上设置代理页面
var module1 = (function(){ var _count = 0; var m1 = function(){ //... }; var m2 = function(){ //... }; return { m1 : m1, m2 : m2 }; })();
defer,只支持IE
async
:
建立script
,插入到DOM
中,加载完毕后callBack
内存泄漏指任何对象在您再也不拥有或须要它以后仍然存在
setTimeout
的第一个参数使用字符串而非函数的话,会引起内存泄漏
闭包使用不当
数据体积方面
JSON
相对于XML
来说,数据的体积小,传递的速度更快些。数据交互方面
JSON
与JavaScript
的交互更加方便,更容易解析处理,更好的数据交互数据描述方面
JSON
对数据的描述性比XML
较差传输速度方面
JSON
的速度要远远快于XML
WebPack
是一个模块打包工具,你可使用WebPack
管理你的模块依赖,并编绎输出模块们所需的静态文件。它可以很好地管理、打包Web
开发中所用到的HTML
、Javascript
、CSS
以及各类静态文件(图片、字体等),让开发过程更加高效。对于不一样类型的资源,webpack
有对应的模块加载器。webpack
模块打包器会分析模块间的依赖关系,最后 生成了优化且合并后的静态资源
CommonJS
是服务器端模块的规范,Node.js
采用了这个规范。CommonJS
规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操做。AMD
规范则是非同步加载模块,容许指定回调函数
AMD
推荐的风格经过返回一个对象作为模块对象,CommonJS
的风格经过对module.exports
或exports
的属性赋值来达到暴露模块对象的目的
sql
注入原理
SQL
命令插入到Web
表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令总的来讲有如下几点
"-"
进行转换等SQL
或者直接使用存储过程进行数据查询存取hash
掉密码和敏感的信息XSS原理及防范
Xss(cross-site scripting)
攻击指的是攻击者往Web
页面里插入恶意html
标签或者javascript
代码。好比:攻击者在论坛中放一个看似安全的连接,骗取用户点击后,窃取cookie
中的用户私密信息;或者攻击者在论坛中加一个恶意表单,当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户本来觉得的信任站点
XSS防范方法
首先代码里对用户输入的地方和变量都须要仔细检查长度和对”<”,”>”,”;”,”’”
等字符作过滤;其次任何内容写到页面以前都必须加以encode,避免不当心把html tag
弄出来。这一个层面作好,至少能够堵住超过一半的XSS 攻击
XSS与CSRF有什么区别吗?
XSS
是获取信息,不须要提早知道其余用户页面的代码和数据包。CSRF
是代替用户完成指定的动做,须要知道其余用户页面的代码和数据包。要完成一次CSRF
攻击,受害者必须依次完成两个步骤
登陆受信任网站A
,并在本地生成Cookie
在不登出A
的状况下,访问危险网站B
CSRF的防护
CSRF
方式方法不少样,但总的思想都是一致的,就是在客户端页面增长伪随机数工厂模式:
new
关键字构造函数模式
this
对象;同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议
举例说明:好比一个黑客程序,他利用Iframe
把真正的银行登陆页面嵌到他的页面上,当你使用真实的用户名,密码登陆时,他的页面就能够经过Javascript
读取到你的表单中input
中的内容,这样用户名,密码就轻松到手了。
offsetWidth/offsetHeight
返回值包含content + padding + border,效果与e.getBoundingClientRect()相同
clientWidth/clientHeight
返回值只包含content + padding,若是有滚动条,也不包含滚动条
scrollWidth/scrollHeight
返回值包含content + padding + 溢出内容的尺寸