完美

[学习|工作|博客|交流平台|完美起航]

作者头像zyw3272018.04.01 23:21 

javascript作用域与函数与闭包

使用递归获取后代元素作用域什么是作用域变量起作用的范围什么是块级作用域JS中没有块级作用域,使用代码块限定的作用域就是块级作用域JS中的作用域叫做 词法作用域词法作用域在代码写好的时候,就能确定变量的作用域,这种作用域就是词法作用域动态作用域.(是词法作用域就不可能是动态作用域)在js当中,只有函数能创造作用域varnum=123; functionf1(){ console.log(num);//如果是动态作用域打印的就是456如果是词法作用域打印123 } functionf2(){ varnum=456; f1(); } f2();变量提升JS代码的运行分两个阶段 预解析阶段 变量名和函数提升 将var声明的变量名和function开头的函数进行提升 提升到当前作用域的最上方 * 执行阶段注意: 1.变量和函数同名的时候 只提升函数,忽略变量名 2.函数同名的时候 都提升,但是后面的函数会覆盖前面的函数 3.函数表达式,只会提升变量名,不会提后面的函数4.变量提升只会将变量和函数提升到当前作用域的最上方funcitonfoo(){ varnum=123; }5.变量提升是分块 <script> 的<script> t> foo()fun(){ o(){ .lco("第一个script标签内的函数") }; </script> <script> t> foo()fun(){ o(){ .lco("第2个script标签内的函数") } </script>6.条件式函数声明 能否被提升,取决于浏览器, 不推荐使用!!!foo();//会报错,因为未被提升 if(true){ functionfoo(){ } }作用域链只要是函数都有作用域,函数内部的作用域可以访问函数外部的作用域当多个函数嵌套的时候,就会形成一个链式的结构,这个就是作用域链绘制作用域链图的步骤1.先绘制0级作用域链2.在全局作用域中查找,变量和函数的声明,找到之后,将所有的变量和函数用小方格放在0级作用域链上3.再从0级作用域链上的函数引出1级作用域链4.再去每一个1级作用域链中查找变量和函数的声明,找到之后.....5.以此重复,就画好了整个作用域链变量的搜索规则1.首先在访问变量的作用域中查找该变量,如果找到直接使用2.如果没有找到,去上一级作用域中继续查找,如果如果找到直接使用3.如果没有找到,继续去上一级作用域中继续查找,直到全局作用域4.如果找到了就用,如果没有直到就报错闭包闭包是什么一个封闭的对外不公开的包裹结构或空间js中的闭包是函数闭包要解决的问题1、在函数外部访问不到函数内部的数据2、要解决的问题就是需要在外部间接的访问函数内部的数据闭包的基本结构functionouter(){ vardata="数据"; returnfunction(){ returndata; } } functionouter(){ vardata="数据"; vardata1="数据1"; return{ getData:function(){ returndata; }, getData1:function(){ returndata1; } } } functionouter(){ var

javascript 30730 2

作者头像zyw3272018.03.24 16:27 

javascript面向对象学习之继承

继承混入式继承for in 使用for in遍历对象1的属性,将所有的属性添加到另外一个对象2上 这时候就可以称 对象2 继承自 对象1原型继承利用对象的动态特性,为原型对象添加成员直接替换原型对象 1.替换前的对象,在替换之后,所有的成员都丢失 2.替换原型对象的时候,需要手动去指定原型对象的construtor属性利用混入给原型对象添加成员经典继承var 对象1 = Object.create(对象2);这个时候,创建出来的对象1继承自对象2Object.create方法存在兼容性问题 如何解决? 1.检测浏览器是否支持Object.create方法,如果不支持,直接手动给Object添加create方法 2.自定义函数,在函数内部判断浏览器是否支持Object.create方法,如果不支持,则手动创建对象返回,否则直接调用 functioncreate(obj){ if(Object.create){ returnObject.create(obj); }else{ functionF(){ } F.prototype=obj; returnnewF(); } }原型链什么是原型链每个构造函数都有原型对象,每个对象都有构造函数,每个构造函数的原型对象都是对象,也就有构造函数 然后就形成一个链式的结构,我们称之为原型链原型继承是什么?通过修改原型链的结构,实现继承的方式就是原型继承对象和原型的成员关系function Person(){};var p = new Person();p对象中包含的成员有:Person.prototype中的成员和自身拥有成员 Person.prototype中的成员有:Object.prototype的成员和自身的成员p对象可以访问Person.prototype和Object.prototype中的所有成员Object.prototype的成员constructor :指向和该原型相关的构造函数hasOwnProperty 方法: 判断对象本身是否拥有某个属性properIsEnumerable 方法: 1.判断属性是否属于对象本身,2.判断属性是否可以被遍历toString toLocaleString: 将对象转换成字符串 toLocalString转换成字符串的时候应用的本地的设置格式valueOf 方法:在对象参与运算的时候,首先调用valueOf方法获取对象的值,如果该值无法参与运算,将会调用toString方法proto 属性: 指向当前对象的原型对象Function3种创建函数的方式直接声明函数函数表达式new Function()可以用Function来创建函数: 语法:var 函数名 = new Function(); //创建一个空的函数var 函数名 = new Function("函数体") //创建一个没有参数的函数var 函数名 = new Function("参数1","参数2", "参数3",..."函数体")//当给Fucntion传多个参数的时候,最后一个参数为函数体,前面的参数为创建出来的函数的形参//Function接收的所有的参数都是字符串类型的!!!arguments对象arguments对象是函数内部的一个对象,在函数调用的时候,系统会默认的

javascript 42317 1

作者头像zyw3272018.03.24 16:12 

node基础知识学习

写出Math Array String 自带的方法,各五个给String,添加一个 getLengt()方法,例如var str ='sss'; str.getLength();,结果为 3用 javascript 实现数组去重书写正则表达式,匹配 浮点数下列代码的输出结果varUser={ count:1, getCount:function(){ returnthis.count; } }; console.log(User.getCount()); varfunc=User.getCount; console.log(func());说说你对闭包的理解,闭包的好处编写代码实现,每隔一分钟异步读取一次 file.logs 文件 ,输出文件中的信息怎么解决 javascript 嵌套回调问题session 的原理,客户端禁用cookie后 怎么使用session遍历一个 javascript 对象,例如{name:'lucy',age:15}express 怎么获取,get 和post方式的传参完成一个函数,接受数组作为参数,数组元素为整数或者数组,数组元素包含整数或数组,函数返回扁平化后的数组如:[1,[2,[[3,4],5],6]]=>[1,2,3,4,5,6]

node 45704 3

作者头像zyw3272018.03.24 16:09 

nodejs理论学习

Node基础概念1.为什么要用node?参考答案:总结起来node有以下几个特点:简单强大,轻量可扩展.简单体现在node使用的是javascript,json来进行编码,人人都会;强大体现在非阻塞IO,可以适应分块传输数据,较慢的网络环境,尤其擅长高并发访问;轻量体现在node本身既是代码,又是服务器,前后端使用统一语言;可扩展体现在可以轻松应对多实例,多服务器架构,同时有海量的第三方应用组件.2. node的构架是什么样子的?参考答案:主要分为三层,应用app >> V8及node内置架构>>操作系统. V8是node运行的环境,可以理解为node虚拟机.node内置架构又可分为三层:核心模块(javascript实现) >> c++绑定>> libuv + CAes + http.3. node有哪些核心模块?参考答案: EventEmitter, Stream, FS, Net和全局对象node全局对象1. node有哪些全局对象?参考答案: process, console, Buffer和exports2. process有哪些常用方法?参考答案: process.stdin, process.stdout, process.stderr, process.on, process.env, process.argv, process.arch, process.platform, process.exit3. console有哪些常用方法?参考答案: console.log/console.info, console.error/console.warning, console.time/console.timeEnd, console.trace, console.table4. node有哪些定时功能?参考答案: setTimeout/clearTimeout, setInterval/clearInterval, setImmediate/clearImmediate, process.nextTick5. node中的事件循环是什么样子的?参考答案: event loop其实就是一个事件队列,先加入先执行,执行完一次队列,再次循环遍历看有没有新事件加入队列.但是请务必注意,这一个事件队列的循环,一次只执行一个事件,然后下一次循环再执行一个事件.这是由于javascript的单线程机制导致的,如果一次循环多个事件,就可能会阻塞其它代码的执行.异步执行的叫IO events, setImmediate是在当前队列立即执行,setTimout/setInterval是把执行定时到到后面的队列,process.nextTick是在当前执行完,下次遍历前执行.所以总体顺序是: IO events >> setImmediate >> setTimeout/setInterval(注册事件) >> process.nextTick.6. node中的Buffer如何应用?参考答案: Buffer是用来处理二进制数据的,比如图片,mp3,数据库文件等.Buffer支持各种编码解码,二进制字符串互转.EventEmitter1.什么是EventEmitter?参考答案: EventEmitter是node中一个实现观察者模式的类,主要功能是

node 46481 1

作者头像zyw3272018.03.24 15:40 

node理论学习

1. 启动一个Node Server,通过这个Server访问一个php文件,怎么输出运行解析php后的结果?2. 怎么在Node里实现一个类似php里的sleep()函数?functionsleep(milliSeconds){ varstartTime=newDate().getTime(); while(newDate().getTime()<startTime+milliSeconds); }; sleep(10000);3. Node 自诩异步编程是它的优势,为什么在引用外部包的时候(require()函数)是同步方法,而非异步方法4. Node 里有readFile和对应的同步方法readFileSync,但http.get() 却没有 http.getSync(),如果要实现一个http.getSync(),怎么做?

node 32230 0

作者头像zyw3272018.03.24 15:21 

nodejs相关原理

什么是错误优先的回调函数?如何避免回调地狱?如何用Node来监听80端口?什么是事件循环?哪些工具可以用来保证一致的编程风格?运算错误与程序员错误的区别?使用NPM有哪些好处?什么是stub?举个使用场景?什么是测试金字塔?对于HTTP API,如何利用测试金字塔?你最喜欢的HTTP框架,并说明原因?现在,我们依次来解答这些问题吧。什么是错误优先的回调函数?错误优先的回调函数用于传递错误和数据。第一个参数始终应该是一个错误对象, 用于检查程序是否发生了错误。其余的参数用于传递数据。例如:fs.readFile(filePath, function(err, data) { if (err) { //handle the error } // use the data object});解析:这个题目的主要作用在于检查被面试者对于Node中异步操作的一些基本知识的掌握。  如何避免回调地狱你可以有如下几个方法:模块化:将回调函数分割为独立的函数使用Promises使用yield来计算生成器或Promise解析:这个问题有很多种答案,取决你使用的场景,例如ES6, ES7,或者一些控制流库。  如何用Node监听80端口这题有陷阱!在类Unix系统中你不应该尝试去监听80端口,因为这需要超级用户权限。 因此不推荐让你的应用直接监听这个端口。目前,如果你一定要让你的应用监听80端口的话,你可以有通过在Node应用的前方再增加一层反向代理 (例如nginx)来实现,如下图所示。否则,建议你直接监听大于1024的端口。方向代理指的是以代理服务器来接收Internet上的连接请求,然后将请求转发给内部网络上的服务器, 并且将服务器返回的结果发送给客户端。关于反向代理的更多内容,建议你阅读这篇文章。解释:这个问题用于检查被面试者是否有实际运行Node应用的经验。  什么是事件循环Node采用的是单线程的处理机制(所有的I/O请求都采用非阻塞的工作方式),至少从Node.js开发者的角度是这样的。 而在底层,Node.js借助libuv来作为抽象封装层, 从而屏蔽不同操作系统的差异,Node可以借助livuv来来实现多线程。下图表示了Node和libuv的关系。Libuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个事件循环, 以异步的方式将任务的执行结果返回给V8引擎。可以简单用下面这张图来表示。每一个I/O都需要一个回调函数——一旦执行完便推到事件循环上用于执行。 如果你需要更多详细的解释,可以参考这个视频。 你也可以参考这篇文章。解释:这用于检查Node.js的底层知识,例如什么是libuv,它的作用是什么。  哪些工具可以用来保证一致性的代码风格你可以选择如下的工具:JSLintJSHintESLintJSCS– 推荐在团队开发中,这些工具对于编写代码非常的有帮助,能够帮助团队开发者强制执行规定的风格指南, 还能够通过静态分析捕获常见的错误。解析:用于检查被面试者是否有大型项目开发经验。  运算错误与程序员错误的区别运算错误并不是bug,这是和系统相关的问题,例如请求超时或者硬件故障。而程序员错误就是所谓的bug。解析:这个题目和Node关系并不大,用于考察面试者的基础知识。  使用NPM有哪些好处?通过NPM,你可以安装和管理项目的依赖,并且能够指明依赖项的具体版本号。 对于Node应用开发而言,你可以通

node 22018 1

作者头像zyw3272018.03.21 20:26 

javascript面向对象

面向对象的三大特性封装继承 自己没有的,拿别人过来用,就是继承多态 父类引用指向子类的对象(JavaScript中用不到)创建对象的四种方式使用字面量创建对象varo={key:value,key:value...}用一个创建一个,不能复用,造成代码冗余,资源浪费使用内置构造函数创建对象varo=newObject(); varo=newArray();创建出来的对象都是空的对象,要手动的去为对象添加属性。造成代码重复封装简单的工厂函数(不推荐使用)functioncreateObj(){ varobj={}; obj.xx=xxx; returnobj; }自定义构造函数function构造函数名{ this.xxx=xxx; //.... }0.构造函数名首字母要大写 1.构造函数一般和new关键字一起使用 2.构造函数返回值默认为新创建好对象 如果手动返回基本数据类型,不影响默认返回值,如果返回的是对象,那么新创建出来的对象将不会返回,取而代之的是return后面的对象构造函数(constructor)的执行步骤 1.使用new关键字创建对象 2.调用构造函数,将new创建出来的对象赋值给构造函数内的this 3.使用this给新创建出来的对象增加成员 4.默认返回新创建出来的这个对象原型构造函数存在问题构造函数中的方法,每新创建一个对象的时候,该对象都会重新的创建一次这个方法,每个独享独占一个方法 但是该方法内容完全相同,所以造成资源浪费1.解决办法1 将构造函数内的方法,进行提取,放在构造函数外面,在构造函数内部进行引用赋值 那么创建出来的对象,都会指向构造函数外面的这个函数,达到共享的目的 问题:全局变量增多,造成全局变量污染,代码结构混乱,不容易维护2.解决办法2 使用原型原型原型是什么?在构造函数创建出来的时候,系统会默认的创建并关联一个对象,这个对象就是原型,原型对象默认是空对象 默认的原型对象中会有一个属性constructor指向该构造函数原型的作用原型对象中的成员,可以被使用和它关联的构造函数创建出来的所有对象共享原型对象的使用使用对象的动态特性,为原型对象添加成员直接替换原型对象注意事项: 直接替换原型对象,会导致替换之前创建的对象的原型和替换之后创建的对象的原型不一致原型的使用该注意事项1.使用对象访问属性的时候,会现在对象中查找,如果找到了就直接使用 如果没有找到,就去原型中查找 2.使用对象设置属性的时候,只会在对象本身中查找,不会去原型中查找,如果在对象本身中没有找到这个属性 则给该对象新增一个属性,如果在对象中有这个属性,修改这个属性 3.如果在原型对象中有引用类型的属性,那么使用对象进行修改该属性内容,则其他所有跟这个原型对象相关的对象都会受到影响 Person.prototype.car = {}; var p = new Person( ); p.car = {}; //这是修改属性 p.car.brand= ""; //这是修改属性的内容 4.一般情况下不会将属性添加到原型对象中 只会将需要共享的方法,添加到原型对象中proto1.这个属性不是标准属性,所以存在通用性问题 2.一般不推荐使用这个属性 3.调试的时候,可以使用这个属性 4.这个属性是原型中的属性替换原型时候的注意事项: 在新替换的原型中,没有constructor属性,会影响三角结构关系的合理性 s

javascript 25218 1

作者头像zyw3272018.03.20 20:34 

JavaScript基础知识

JavaScript的基本组成ECMAScript 语法规范DOM 操作dom元素的apiBOM 操作浏览器对象的apiJavaScript数据类型简单数据类型stringnumberbooleanundefined复杂数据类型ObjectArrayDateRegExpFunctionStringNumberBooleannullMath部分关键字的使用in判断属性是否存在于对象中for in 遍历对象的 键typeof 判断对象的类型 返回值是string类型的 引用类型中,除了function其他的对象都是object类型delete删除对象的属性删除未使用var声明的变量返回值为boolean 表示是否删除成功注意:删除的属性如果不存在,返回true删除的如果是原型中的属性,返回true 但是删除不成功break continuebreak 用来终止循环continue 用来跳出当前循环,继续下次循环=== 和 ===== 要判断数据类型和值是否相等== 值判断值是否相等|| 和 &&表达式1 || 表达式2 如果 表达式1 就 返回 表达式1 否则 返回 表达式2表达式1 && 表达式2 如果 表达式1 就 返回 表达式2 否则 返回 表达式1值类型和引用类型值类型: 存储的是数据本身的值就是值类型的数据引用类型:存储的是数据的地址的值就是引用类型的数据,数据自己在内存中单独存储值类型的赋值:直接将存储的数据复制一份赋值给新的变量 两个变量独立存在互不影响引用类型赋值:将存储的数据的地址复制一份赋值给新的额便令 两个变量指向同一个对象,相互影响异常处理异常的最大的特征:一旦发生异常,后面的代码都不会再执行异常处理语句 try catch finally如何手动抛出异常: throw 任何东西, catch中会抓到该东西try{ //可能出现异常的代码 }catch(e){ //e就是出现异常的异常信息 //出现异常后的处理代码 }finally{ //不管有没有出现异常,都会执行的代码 //一般用来释放资源 }面向对象的基本介绍面向对象是什么?面向对象是一种思维方式. 是将解决问题的关注点放到解决问题所需要的一些列对象上。面向过程是什么?面向过程是一种思维方式. 是将解决问题的关注点放到解决问题的详细的步骤上。面向过程和面向对象的关系面向对象是对面向过程的封装!!!什么是对象?万物皆对象JavaScript中什么是对象键值对儿的集合就是对象

javascript 22627 1

作者头像zyw3272018.03.18 17:15 

axios的相关笔记

1、axios的特点有哪些?答:一、Axios 是一个基于 promise的 HTTP 库,支持promise所有的API二、它可以拦截请求和响应三、它可以转换请求数据和响应数据,并对响应回来的内容自动转换成 JSON类型的数据四、安全性更高,客户端支持防御 XSRF2、axios有哪些常用方法?答:一、axios.get(url[, config]) //get请求用于列表和信息查询二、axios.delete(url[, config]) //删除三、axios.post(url[, data[, config]]) //post请求用于信息的添加四、axios.put(url[, data[, config]]) //更新操作3、说下你了解的axios相关配置属性?答:`url`是用于请求的服务器URL`method`是创建请求时使用的方法,默认是get`baseURL`将自动加在`url`前面,除非`url`是一个绝对URL。它可以通过设置一个`baseURL`便于为axios实例的方法传递相对URL`transformRequest`允许在向服务器发送前,修改请求数据,只能用在'PUT','POST'和'PATCH'这几个请求方法`headers`是即将被发送的自定义请求头headers:{'X-Requested-With':'XMLHttpRequest'},`params`是即将与请求一起发送的URL参数,必须是一个无格式对象(plainobject)或URLSearchParams对象params:{ ID:12345 },`auth`表示应该使用HTTP基础验证,并提供凭据这将设置一个`Authorization`头,覆写掉现有的任意使用`headers`设置的自定义`Authorization`头auth:{ username:'janedoe', password:'s00pers3cret' },'proxy'定义代理服务器的主机名称和端口`auth`表示HTTP基础验证应当用于连接代理,并提供凭据这将会设置一个`Proxy-Authorization`头,覆写掉已有的通过使用`header`设置的自定义`Proxy-Authorization`头。proxy:{ host:'127.0.0.1', port:9000, auth::{ username:'mikeymike', password:'rapunz3l' } },keep-alivevue性能

axios 12589 2

作者头像zyw3272018.03.18 17:11 

Vuex的学习

1、vuex有哪几种属性?答:有五种,分别是 State、 Getter、Mutation 、Action、Module2、vuex的State特性是?答:一、Vuex就是一个仓库,仓库里面放了很多对象。其中state就是数据源存放地,对应于与一般Vue对象里面的data二、state里面存放的数据是响应式的,Vue组件从store中读取数据,若是store中的数据发生改变,依赖这个数据的组件也会发生更新三、它通过mapState把全局的 state和 getters 映射到当前组件的 computed 计算属性中3、vuex的Getter特性是?答:一、getters 可以对State进行计算操作,它就是Store的计算属性二、 虽然在组件内也可以做计算属性,但是getters 可以在多组件之间复用三、 如果一个状态只在一个组件内使用,是可以不用getters4、vuex的Mutation特性是?答:一、Action 类似于 mutation,不同在于:二、Action 提交的是 mutation,而不是直接变更状态。三、Action 可以包含任意异步操作5、Vue.js中ajax请求代码应该写在组件的methods中还是vuex的actions中?答:一、如果请求来的数据是不是要被其他组件公用,仅仅在请求的组件内使用,就不需要放入vuex 的state里。二、如果被其他地方复用,这个很大几率上是需要的,如果需要,请将请求放入action里,方便复用,并包装成promise返回,在调用处用async await处理返回的数据。如果不要复用这个请求,那么直接写在vue文件里很方便。6、不用Vuex会带来什么问题?答:一、可维护性会下降,你要想修改数据,你得维护三个地方二、可读性会下降,因为一个组件里的数据,你根本就看不出来是从哪来的三、增加耦合,大量的上传派发,会让耦合性大大的增加,本来Vue用Component就是为了减少耦合,现在这么用,和组件化的初衷相背。

vuex 8689 3

a6bfb44cbd5549740eb36647f36ef83a