详细~
文章总结:html
setTimeout(fn,ms)这个函数,是通过指定时间后,把要执行的任务加入到Event Queue中,又由于是单线程任务要一个一个执行,若是前面的任务须要的时间过久,那么只能等着,致使真正的延迟时间远远大于ms。
setInterval会每隔指定的时间将注册的函数置入Event Queue,若是前面的任务耗时过久,那么一样须要等待
setInterval为了不代码运行好几回中间没有间隔,当且仅当没有该定时器的如何代码实例时,才会将定时器代码添加到队列中,但这样可能会引发:node
setTimeout(function(){ //do something setTimeout(arguments.callee,interval); },interval)
上面实现了递归调用,这样作的好处是:在前一个定时器代码执行完成以前,不会向队列插入新的定时代码,确保不会有任何的缺失间隔。并且,它保证在下一次定时器代码执行以前,至少要等待指定的时间间隔。
讲道理,我没搞清楚,怎么就递归了
异步中的宏任务和微任务编程
分别把事件放入宏任务和微任务,这是一次循环,而后执行微任务,在开始下一次循环json
关于闭包
理解起来仍是以为怪怪的后端
四种方法跨域
typeofpromise
instanceof浏览器
在原型链上查找 //假设instanceof运算符左边是L,右边是R L instanceof R //instanceof运算时,经过判断L的原型链上是否存在R.prototype L.__proto__.__proto__ ..... === R.prototype ? //若是存在返回true 不然返回false 注意:instanceof运算时会递归查找L的原型链,即 L.__proto__.__proto__.__proto__.__proto__... 直到找到了或者找到顶层为止
instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型 闭包
constructorapp
- null 和 undefined 是无效的对象,所以是不会有 constructor 存在的,这两种类型的数据须要经过其余方式来判断。
- 函数的 constructor 是不稳定的,这个主要体如今自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object
toString
toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。 对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其余对象,则须要经过 call / apply 来调用才能返回正确的类型信息。
Object.prototype.toString.call(Symbol()); //[object Symbol] Object.prototype.toString.call(undefined) ; // [object Undefined] Object.prototype.toString.call(new Error()) ; // [object Error]
documnet.domain
- 只能把document.domain设置成自身或更高一级的父域,且主域必须相同。例如:a.b.example.com 中某个文档的document.domain 能够设成a.b.example.com、b.example.com 、example.com中的任意一个,可是不能够设成 c.a.b.example.com,由于这是当前域的子域,也不能够设成baidu.com,由于主域已经不相同了。就是只能子域获取父域
- 若是想要获取同级中其余页面的数据,须要嵌入iframe,且把两个页面的document.domain设成父域
在页面 http://www.example.com/a.html 中设置document.domain:
在页面 http://example.com/b.html 中也设置document.domain,并且这也是必须的,虽然这个文档的domain就是example.com,可是仍是必须显示的设置document.domain的值:
window.name
在一个窗口(window)的生命周期内,窗口载入的全部的页面都是共享一个window.name的,每一个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的全部页面中的,并不会因新页面的载入而进行重置。
注意,window.name的值只能是字符串的形式,这个字符串的大小最大能容许2M左右甚至更大的一个容量,具体取决于不一样的浏览器,但通常是够用了。
假如www.baidu.com/a.html获取不一样域的www.baidu.com/data.html页面中的值
data.html
a.html
window.postMessage
- 调用postMessage方法的window对象是指要接收消息的那一个window对象,该方法的第一个参数message为要发送的消息,类型只能为字符串;第二个参数targetOrigin用来限定接收消息的那个window对象所在的域,若是不想限定域,可使用通配符 * 。
- 须要接收消息的window对象,但是经过监听自身的message事件来获取传过来的消息,消息内容储存在该事件对象的data属性中。
CORS
分为简单请求和非简单请求
须要后端设置:
Access-Control..................
view到model
好比input输入框,监听input输入框的内容是否发生了变化,oninput事件
// view到model var input = document.getElementById("a"), title = document.getElementById("title"); //title是文字展现区域的id input.oninput = function (e) { title.innerHTML = this.value; };
// model到view Object.defineProperty(input, 'val', { //这里必须定义一个新的属性名称,不能够用value,不然会报错。 get: function () { return this.value; }, set: function (val) { this.value = val; title.innerHTML = val; } });
事件委托 target和currentTarget
假设事件绑定在ul上,ul有子元素li
e.currentTarget始终指向添加监听事件的那个对象,假如是ul,而e.target指向触发事件监听的那个对象,是li
注意:
promise实例
promise存在的问题
带 async 关键字的函数,它使得你的函数的返回值一定是 promise 对象;await等的是右侧「表达式」的结果(遇到await会让出线程,但await后面那个紧跟着的那个函数不会被阻塞)