事件委托:javascript
给父元素绑定事件监听,子元素经过事件冒泡触发事件 好处:1.内存占用减小 2.删除子元素时不须要解绑事件java
===========================编程
this对象:基于执行环境绑定数组
匿名函数执行环境具备全局性,因此this指向window浏览器
===========================服务器
闭包:在一个函数内部定义的函数会将包含函数的活动对象添加到它的做用域链中网络
为何使用闭包
1.利用闭包实现数据私有化或模拟私有方法框架
2.柯里化异步
===========================
原型继承:
===========================
(function foo(){ })()
和(function foo(){ }())
。以上函数不会暴露到全局做用域
===========================
null
、undefined
和未声明变量之间有什么区别:1.没有提早使用var
、let
或const
声明变量,就为一个变量赋值时,该变量是未声明变量,未声明变量会脱离当前做用域,成为全局做用域下定义的变量。
2.当一个变量已经声明,但没有赋值时,该变量的值是undefined
。若是一个函数的执行结果被赋值给一个变量,可是这个函数却没有返回任何值,那么该变量的值是undefined
。
3.null
只能被显式赋值给变量。它表示空值
===========================
.forEach
和.map()
的主要区别在于.map()
返回一个新的数组。若是你想获得一个结果,但不想改变原始数组,用.map()
。若是你只须要在数组上作迭代修改,用forEach
。
===========================
匿名函数能够在 IIFE 中使用,来封装局部做用域内的代码,以便其声明的变量不会暴露到全局做用域。
匿名函数能够做为只用一次,不须要在其余地方使用的回调函数。当处理函数在调用它们的程序内部被定义时,代码具备更好地自闭性和可读性
匿名函数能够用于函数式编程或 Lodash(相似于回调函数)
===========================
Object.creat()与new
===========================
Ajax(asynchronous JavaScript and XML)是使用客户端上的许多 Web 技术,建立异步 Web 应用的一种 Web 开发技术。借助 Ajax,Web 应用能够异步(在后台)向服务器发送数据和从服务器检索数据,而不会干扰现有页面的显示和行为。经过将数据交换层与表示层分离,Ajax 容许网页和扩展 Web 应用程序动态更改内容,而无需从新加载整个页面。实际上,如今一般将 XML 替换为 JSON,由于 JavaScript 对 JSON 有原生支持优点。
优势
缺点
===========================
JS模板:Handlebars、Underscore、Lodash、AngularJS 和 JSX
===========================
“Attribute” 是在 HTML 中定义的,而 “property” 是在 DOM 上定义的。
===========================
'use strict' 是用于对整个脚本或单个函数启用严格模式的语句。严格模式是可选择的一个限制 JavaScript 的变体一种方式 。
优势:
this
的值为undefined
。缺点:
function.caller
和function.arguments
。===========================
在现代的 SPA 中,客户端渲染取而代之。浏览器从服务器加载初始页面、整个应用程序所需的脚本(框架、库、应用代码)和样式表。当用户导航到其余页面时,不会触发页面刷新。该页面的 URL 经过 HTML5 History API 进行更新。浏览器经过 AJAX 请求向服务器检索新页面所需的数据(一般采用 JSON 格式)。而后,SPA 经过 JavaScript 来动态更新页面,这些 JavaScript 在初始页面加载时已经下载。这种模式相似于原生移动应用的工做方式。
好处:
坏处:
===========================
Promise
代替回调函数有什么优缺点?优势:
.then()
编写的顺序异步代码,既简单又易读。Promise.all()
编写并行异步代码变得很容易。缺点:
===========================、
对象:
for
循环:for (var property in obj) { console.log(property); }
。可是,这还会遍历到它的继承属性,在使用以前,你须要加入obj.hasOwnProperty(property)
检查。Object.keys()
:Object.keys(obj).forEach(function (property) { ... })
。Object.keys()
方法会返回一个由一个给定对象的自身可枚举属性组成的数组。Object.getOwnPropertyNames()
:Object.getOwnPropertyNames(obj).forEach(function (property) { ... })
。Object.getOwnPropertyNames()
方法返回一个由指定对象的全部自身属性的属性名(包括不可枚举属性但不包括 Symbol 值做为名称的属性)组成的数组。数组:
for
loops:for (var i = 0; i < arr.length; i++)
。这里的常见错误是var
是函数做用域而不是块级做用域,大多数时候你想要迭代变量在块级做用域中。ES2015 引入了具备块级做用域的let
,建议使用它。因此就变成了:for (let i = 0; i < arr.length; i++)
。forEach
:arr.forEach(function (el, index) { ... })
。这个语句结构有时会更精简,由于若是你所须要的只是数组元素,你没必要使用index
。还有every
和some
方法可让你提早终止遍历。大多数状况下,我更喜欢.forEach
方法,但这取决于你想要作什么。for
循环有更强的灵活性,好比使用break
提早终止循环,或者递增步数大于一。
===========================
柯里化(currying)是一种模式,其中具备多个参数的函数被分解为多个函数,当被串联调用时,将一次一个地累积全部须要的参数。这种技术帮助编写函数式风格的代码,使代码更易读、紧凑。值得注意的是,对于须要被 curry 的函数,它须要从一个函数开始,而后分解成一系列函数,每一个函数都须要一个参数。
===========================
===========================
===========================