HOU AILING
HOU AILING
```js function curry(fn) { let oldArgs = Array.prototype.slice.call(arguments, 1); return function() { let newArgs = Array.prototype.slice.call(arguments); let args = newArgs.concat(oldArgs); if (args.length >= fn.length) { return fn.apply(this, args); } else...
### 1.变量提升 var会进行变量提升,let和const不会进行提升 ### 2.暂存死区 因为var会进行变量提升,所以可以在声明之前访问,不会形成暂存死区。let 和const 不会进行变量提升,在声明之前不能使用,形成暂存死区 ### 3.重复声明 var可以进行重复声明,但是let和const不能进行重复声明 ### 4.块作用域 var不会形成块作用域,let和const可以形成块作用域 ### 5.重新赋值 var和let声明的变量可以重新赋值,const不可以。如果const 声明的变量存储的是引用地址, 是可以修改这个引用对应的对象的值的,但是这个变量不能被赋予其他值
```js Promise.race = function(promises) { return new Promise(function(resolve, reject) { if (!promises || typeof promises[Symbol.iterator] !== 'function') { reject(TypeError()); } for (let i = 0; i < promises.length; i++) {...
函数节流,是指如果一个事件不停地触发,那么就每隔一定的时间才执行回调函数,回调函数的执行会被稀释。 **应用场景:** 函数节流典型的应用场景就是图片懒加载,用户下啦页面,需要监听wheel事件,然后判断是否应该展示图片。这个判断就可以用函数节流来做,没必要一直判断。 **实现:** - 时间戳方式 ```js function throttle(fn, delay) { let pre = 0; return function() { let now = Date.now(); if ((now - pre) >= delay) { fn.apply(this,...
浅拷贝和深拷贝主要是用来区别拷贝引用类型的值的情况,浅拷贝直接拷贝引用类型的值的引用地址。深拷贝是拷贝引用类型的值对应的在堆内存中存储的值。 Object.assign(source, target), 以及对象展开操作符{...source}实现的是浅拷贝,JSON.parse(JSON.stringify(source))可以实现浅拷贝,但是对象必须是json安全的,比如无法识别undefined, 函数等 对象深拷贝的递归实现 ```js function deepClone(obj) { if (obj === null) return obj; if (typeof obj !== 'object') return obj; let copy = new obj.constructor(); for (let...
思想: 借助原型基于已有的对象创建新的对象,同时不需要创建自定义类型。 ```js function inherit(o) { function F() {} F.prototype = o; return new F(); } ``` 从上面的代码可以看出来,如果传入inherit函数的对象包含一个引用类型的值,那么修改这个新创建的对象继承来的这个值会影响传入的这个对象,因此通过这个对象创建的其他的新对象也会受到影响。 ```js function inherit(o) { function F() {} F.prototype = o; return new...
Jsonp是实现跨域请求的一种方式,原理是利用标签的src属性不受同源策略限制的特点,来发送跨域请求。 1. 声明一个回调函数 2. 创建一个包含回调函数名称的url地址 3. 服务器端接收到这个请求,根据url地址中的参数获取到回调函数的名称,然后将数据传递给回调函数,返回这个回调函数的调用给前端 4. 浏览器拿到包含数据的回调函数的调用,并执行这个代码 ```js function callback(data) { //do something with data } function jsonpFunc(url, cb) { let script = document.createElement('script'); script.src = url +...
### 1.给script标签添加defer属性 - defer属性会让js并行下载,但是要等到HTML解析完成之后,在window.onload事件之前执行 - 添加了defer属性的js文件执行的顺序和在文档中定义的顺序一样 ```html ``` ### 2.给script标签添加async属性 - async属性会让js并行下载,但是js文件下载完成之后立刻执行无论html是否解析完毕 - 添加了async属性的js文件执行顺序不能保证 ```html ``` ### 3.动态创建script标签 - 和img标签不一样,设置了script的src并不会开始下载,而是要添加到文档中Js文件才会开始下载 ```js let script = document.createElement('script'); script.type = 'text/javascript'; script.src =...
== 最大的特点在于允许进行类型转换,对于对象的转换会进行toPrimitive操作,也就是先调用valueOf方法如果不能返回基本类型的值就调用toString方法 ```js var a = { valueOf: (function() { var temp = 1; // 使用闭包来保存这个变量 return function() { return temp++; } }()) } ```
做一个类比,假设你和你的朋友chatty通过微信聊天,她非常的健谈,那么你有如下几种方式来处理她的消息: - 最基本的就是时不时就看微信,这样会很浪费时间,但获取信息的实时性很高 - 函数节流: 每隔5分钟查看一次,这样获取信息的实时性不高,但是不会耽误你获取信息 - 函数防抖:假设她把她的故事分成了好几段发给你,你假定在5分钟内她没有再发信息就是整个故事已经发完了,然后再去查看。(函数防抖的非立即执行版) 在浏览器中,有很多事件比如window的onresize 鼠标的mousemove 以及滚轮事件wheel等,他们触发的很频繁,这个时候函数没必要一直执行。函数防抖就是让事件触发的n秒内只执行一次,如果连续触发就重新计算时间. ```js function debounce(fn, delay, immediate) { let timer = null; return function() { clearTimeout(timer); //重新计算时间 let context = this;...