You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
function getValue() {
return 'c';
}
function functions(flag) {
if (flag) {
function getValue() { return 'a'; }
} else {
function getValue() { console.log(1);return 'b'; }
}
return getValue();
}
console.log(functions(true));
这里本以为这一段代码最后总是会返回b,牛客上的题也是这么设计的,但后来的node环境可能做了些修正,这里其实会返回a的。。。,而且没输出1说明第二个函数解析都没解析,所以个人对函数的理解是
->1、函数解析本身并不存在“变量提升”
紧接着第二个测试
function doSth(func,a,b){
function func(a,b) {
return a-b;
}
return func(a,b);
}
function func(a,b) {
return a+b;
}
console.log(doSth(func,1,2));
->2、函数的调用沿作用域链查找
紧接着看了网上大牛的3个测试
(function(){
function a(){};
var a;
console.log(typeof a); //function
})();
(function(){
console.log(typeof a);//function
function a(){};
var a = 1;
})();
(function(){
function a(){};
var a = 1;
console.log(typeof(a)); //number
})();
->3、js先解析再执行(会被覆盖)
词法分析一个
function a(){
var b = 'a';
function b(){
console.log('b')
}
console.log(b)
}
a()
//解析时
function a(){
var b = 'a';
b = function b(){console.log('b')};
console.log(b);
}
//执行时
function a(){
b = function b(){console.log('b')};
var b = 'a';
console.log(b);
}
a();
<inputtype="text" id="input" style="width:100%;"><script>window.onload=function(){varnick=prompt("enter your name");varinput=document.getElementById('input');input.focus();varsocket=newWebSocket("ws://"+location.host+"/");socket.onmessage=function(event){//从服务器获取信息varmsg=event.data;varnode=document.createTextNode(msg);vardiv=document.createElement('div');div.appendChild(node);document.body.insertBefore(div,input);input.scrollIntoView();}//通过WebSocket发送消息给服务器端input.onchange=function(){varmsg=nick+":"+input.value;socket.send(msg);input.value="";}};</script>
服务端
varhttp=require('http');varws=require('websocket-server');varclientui=require('fs').readFileSync("test.html");varhttpserver=newhttp.Server();httpserver.on("request",function(request,response){if(request.url=='/'){response.writeHead(200,{"Content-Type":"text/html"});response.write(clientui);response.end();}else{response.writeHead(404);response.end();}});//在http服务器上包装一个websocket服务器varwsserver=ws.createServer({server:httpserver});wsserver.on("connection",function(socket){socket.send("Welcome to the chat room.");socket.on("message",function(msg){wsserver.broadcast(msg);})})wsserver.listen(8000);
Js基础
前言:
校招时写的,算是js入门知识了,博客迁移来的
es5
js数据类型
栈:原始数据类型undefined,Null,Boolean,Number(含NaN),String(字符串不可修改))
堆:引用数据类型对象,数组,函数,Date
基本数据类型和引用数据类型的区别
注意两种判定方法的大小写。。。
类型转化问题
这个问题在《你不知道的JS》中有较为详尽的解释,当初看的时候也是一扫而过觉得精彩,直到突然有一天在面试中被问到 [] == true 和 {} == true 才突然觉得这里可以搞。
引例
在说类型转化之前先说下基本类型和引用类型,js中六大基本数据类型都是保存在栈中,而引用类型如数组、函数或者Object都是保存在堆中,当我们赋予a = obj 这种情况时,实际上a是只是一个指向obj的指针,嗯。。。下面的例子蛮明晰的我觉得
理论实践结合,看看中间算法
实践查表
理论算法
变量声明之var,let,const
讲的挺全的
变量提升
这段代码很经典,出现情况是定义赋值前引用,如果我们把后面的赋值去掉,根据前面的规则,结果还是undefined,如果只保留tmp = 'hello world'那么结果会正常输出,我觉得这种变量提升和函数作用域中的作用域链有一定的关系,注意这个和函数先解析没关系,,为了避免误解再来两个。
对闭包的理解及常见应用场景
以下举几个闭包典型例子~
1、高阶函数
像sort,map,filter,reduce他们就是不错的例子,正则里的replace附带函数,
2、函数科里化
3、偏函数
个人理解是借用函数的前一部分形参作为输入(一般不做输出),后一部分可输入可输出,来产生一个新的定制函数的形式(选自朴灵)
js单线程
异步与回调
参考
事件循环与任务队列
JS 会创建一个类似于 while (true) 的循环,每执行一次循环体的过程称之为 Tick。每次 Tick 的过程就是查看是否有待处理事件,如果有则取出相关事件及回调函数放入执行栈中由主线程执行。待处理的事件会存储在一个任务队列中,也就是每次 Tick 会查看任务队列中是否有需要执行的任务。
异步操作会将相关回调添加到任务队列中。而不同的异步操作添加到任务队列的时机也不同,如 onclick, setTimeout, ajax 处理的方式都不同,这些异步操作是由浏览器内核的 webcore 来执行的,webcore 包含上图中的3种 webAPI,分别是 DOM Binding、network、timer模块。
举例:
onclick 由浏览器内核的 DOM Binding 模块来处理,当事件触发的时候,回调函数会立即添加到任务队列中
setTimeout 会由浏览器内核的 timer 模块来进行延时处理,当时间到达的时候,才会将回调函数添加到任务队列中
ajax 则会由浏览器内核的 network 模块来处理,在网络请求完成返回之后,才将回调添加到任务队列中。
参考
JS 只有一个线程,称之为主线程。而事件循环是主线程中执行栈里的代码执行完毕之后,才开始执行的。所以,主线程中要执行的代码时间过长,会阻塞事件循环的执行,也就会阻塞异步操作的执行。只有当主线程中执行栈为空的时候(即同步代码执行完后),才会进行事件循环来观察要执行的事件回调,当事件循环检测到任务队列中有事件就取出相关回调放入执行栈中由主线程执行
补充我个人觉得的话上述那个例子作为微任务宏任务的简化例子就差不多了
上大牛
原型与原型链与构造函数
new、proto、prototype、constructor
我觉得这种概念用图说话最好,这个图简直比红宝书还要简洁明了
这个就涉及到了Object.prototype了
函数与作用域
this的理解
原理层面
实战层面(cherry的文章)
修正补充一下,cherry的文章适合用es5的this,箭头函数中确实this也是指向引用它的那个环境,可是这个环境官方是有所定义的。
重要的几点:
箭头函数参考
函数参数与arguments
例子讲解~
作用域链的理解
一般是出现在闭包研究问题的这个过程里吧哈哈,这里不是很难,记录一篇有关作用域的文章,单纯觉得写得很有趣
皮
面向对象与继承
注:面向对象是一项非常有用的模式,js在初生时并没有考虑太多这方面的问题,后来无数js大牛创造出了这种模式,感
觉js创建对象的方法也有很多,工厂模式,原型模式,构造函数模式等等。。。。各大教科书高程什么的讲得很全,
个人筛选出了可能比较好的两种模式,毕竟没法记住所有的方法。。
创建对象
继承
这种继承的缺点是调用了两次父类构造函数性能消耗大一点,但是相对于其他的继承方案而言已经是比较不错的继承方法了
F算是对红宝书的致敬吧,上面记得用的就是这个F,当时老实讲还没看懂orz,现在理解了其实就是有一次构造函数的调用变成一个啥也没有的构造函数的调用(这样会不会使原型链稍显混乱?233)说个有趣的事情吧,其实Object.create()就是上述的中间层替换的语法糖,看下MDN的polyfill()2333
但是这种构造函数的情况下不太适合写Object.create()哈,一般他和对象字面量结合在一起玩~
对象的深浅拷贝
在讨论深浅拷贝问题,先思考一下这个问题的实际出现场景,我们这里用到了最简单的变量,函数,和没有函数的字面量对象三种情况:
所以得出出现深浅拷贝问题的情形在于对象,对象赋值或者说对象引用后改动的影响
先给出这样的场景:
方法一: json转换(因为底层是二进制)
这个就是会吧原来的数据转化为字符串,这是针对对象的所有引用关系就不复存在了,然后再转化回来就是
一个全新的对象。不在出现新对象改动污染原始对象的问题了.
缺点:对象里不能含有函数,也就是说只适于json支持的数据格式
方法二: 手写个clone函数吧
探索: jQuery源码中的extend
感觉好难,自己模仿着�写了一个不知道对不对
跨域
跨域问题一直是前端非常重要的一点,会出现在像ajax这种向其他网站发送请求的过程中(出于安全性考虑,浏览器不允许ajax跨域获取数据,当你访问地址的时候,实际上数据已经从别的域名拿过来了(可以从network上的接收包查看),但是浏览器为了保障不被信用的数据注入本地,进行了拦截),写一个小文章简单研究一下吧~
同源策略
说到跨域必须要先提的就是浏览器的同源策略,不符合同源策略的请求就叫跨域请求。如果两个网页的域名、协议、端口均相同他们就是同源的,反之就是非同源的,此时不会执行跨域的脚本。
跨域的方法
参考
+红宝书上一个图像ping
通信
由对跨域的分析看了红宝书之后觉得通信部分也值得一写。主要分为页面向服务器请求数据的技术Ajax,服务器向页面推送数据的技术Comet,全双工通信和页面间的通信方案。
Ajax(页面->服务器)
完整的ajax封装
Comet(服务器->页面)
实现方式
自己在csdn上的文章
大佬的即时通讯node代码
Web Sockets(全双工通信)
使用自定义协议,连接为ws://和wss://(加密)
能够在客户端和服务器之间发送非常少量的数据,而不必担心HTTP那样字节级的开销。
官方制定协议的事件比制定js 的api的时间还要慢,不支持DOM2级语法,所以要用socket.open=function()这种
0:正在建立连接
1:已经建立连接
2:正在关闭连接
3:已经关闭连接
页面间通信
原理:“当同源页面的某个页面修改了localStorage,其余的同源页面只要注册了storage事件,就会触发”;
标签页1
标签页2
测试:需要http-server下两个网页所在目录,不能在本地打开,这样当一个页面的值发生变化时,另一个页面也跟着发生变化
客户端:
服务端
es6
es6的新特性
请见
相对比较全的包括第六变量类型symbol、箭头函数独特之处和解构赋值等)
补充
1、我觉得箭头函数就是用来解决闭包第二个return指向windows的这种情况
2、箭头函数用完即丢感觉有点儿爽。。。。
3、写了一下箭头函数顺便也把this的问题解决了,其实在出现箭头函数问题之前都是用that解决的2333
Promise专题
pending
fulfilled
rejected
resolve便指的是pending->fulfilled || pending->rejected,当状态改变后便定型便是resolved,所以注意Promise是三个状态
Promise基础手册
generator迭代器
同理也能在es 6入门那书中找到答案(串行并行请求没有233)
Generator函数
async/await
async/await基础
觉得比较合理的想法是如果发送的是串行请求的话,那么用async,并行的话用Promise.all,至于以前想的async自动化执行的问题,他本来不就是把generator函数和自动执行器包装在一个函数里吗。。
async函数
代码�风格与规范
代码风格
es6 风格(阮一峰 es6入门)
对象关联风格代替原型链风格 (选自《你不知道的JS》)
jQuery链式风格
html与�js逻辑分离的风格
能用css完成的动画效果不用js完成
代码规范
命名小写pc与phone下划线,css类名中划线,函数单驼峰,React组件双驼峰
The text was updated successfully, but these errors were encountered: