这篇文章主要是对自己前端知识的缺失点进行总结和归纳。希望对大家有用,会持续更新的~解释型语言和编译型语言。在程序执行之前,编译语言有一个单独的编译过程将程序翻译成机器语言。后面执行程序的时候,就不用翻译了。解释型语言在运行时将程序翻译成机器语言,因此运行速度比编译型语言慢。C/C++等都是编译型语言,而Java、C#等都是解释型语言。JS类似于编译型语言,要经过词法分析、语法分析、AST生成三个步骤。模块的详细解释请参考commonJSCommonJS模块参考,如果你需要一个模块,就意味着你执行该文件的代码,最后得到该模块输出的module.exports对象的副本。在CommonJS模块中,require导入模块的位置会影响输出结果,会生成一个值的副本。CommonJS模块重复导入的模块不会重复执行。检索模块只会获得先前获得的模块的副本。ES6输出值ES6模块中的引用不再生成输出对象的副本,而是动态关联模块中的值。导入命令将由JavaScript引擎静态分析并优先于模块中的其他内容执行。导出命令具有早期变量声明的作用。空对象Object.create(null)的结果和{}类似,但是没有创建Object.prototype委托,所以比{}更空。null和undefinednull的区别是真正的“无”,代表一个空对象指针,即变量不指向任何对象。undefined表示默认值,即这里应该有值但是还没有定义。转换成数值类型时,区别很大Number(undefined)//NaN5+undefined//NaNNumber(null)//0理解js中的构造函数functionMyFunction(){}varobj1=newMyFunction()varobj2=newMyFunction()其实上面的代码可以等价于functionMyFunction(){}varobj1={}MyFunction.call(obj1)在js里面,先用new操作符创建一个对象,然后用function的this绑定到这个对象来执行这个函数。硬绑定bind引用则不同:bind返回对应的函数,方便后面调用;立即申请并致电。ImplementFunction.prototype.bind2=function(context){if(typeofthis!=="function"){thrownewError("Function.prototype.bind-试图绑定的是不可调用的");}变种自己=这个;varargs=Array.prototype.slice.call(arguments,1);varfNOP=函数(){};varfBound=function(){varbindArgs=Array.prototype.slice.call(参数);returnself.apply(thisinstanceoffNOP?this:context,args.concat(bindArgs));}fNOP.prototype=this.prototype;fBound.prototype=newfNOP();returnfBound;}箭头函数functionfoo(){return(a)=>{console.log(this.a);};}varobj1={a:2};varobj2={a:3};varbar=foo.call(obj1);bar.call(obj2);//2,不是3在!foo()中创建的箭头函数在调用时捕获foo()的this。由于foo()的this绑定了obj1,bar(指箭头函数)的this也绑定了obj1,箭头函数的绑定是不能修改的。(新的也不行!)安全xss(跨站脚本攻击)的原理是攻击者向存在XSS漏洞的网站输入(传入)恶意HTML代码。当其他用户浏览网站时,这段HTML代码会自动执行,从而达到攻击的目的。例如窃取用户cookies,破坏页面结构,重定向到其他网站等。具体请参考csrf(跨站请求伪造)macrotask和microtask,请参考HTTPkeep-alive,请参考whythree-way需要握手,具体参考AJAXReactreact-router实现原理,参考2
