前言农历2019年即将过去。前几天趁着工作空虚,整理了一下javascript的基础知识,在这里分享给大家。喜欢大佬们可以给个小赞哦。本文也收录在github中。我的github:github.com/Michael-lzgJS基本总结(一)——数据类型JS基本总结(二)——原型和原型链JS作用域Javascript变量的作用域无外乎两种:全局变量和局部变量。Javascript语言的特殊之处在于可以在函数内部直接读取全局变量。全局作用域(GlobalScope)可以在代码中任何地方访问的对象都具有全局作用域。一般来说,以下几种情况具有全局作用域:1.最外层函数和定义在最外层函数外的变量具有全局作用域varname='Jack'//全局定义functionfoo(){varage=23//localdefinitionfunctioninner(){//局部函数console.log(age)//age23}inner()}console.log(name)//yuanconsole.log(age)//UncaughtReferenceError:ageisnotdefined,thereisnosuchvariableoutsidefoo()//内嵌函数的打印23inner()//UncaughtReferenceError:innerisnotdefined因为是内置函数,找不到这个函数2.所有没有定义直接赋值的变量自动声明为具有全局范围varname='yuan'functionfoo(){age=23//全局定义varsex='male'//局部定义}foo()console.log(age)//23console.log(sex)//性别未定义3.window对象的所有属性都具有全局作用域一般来说,window对象的内置属性都具有全局作用域,比如window.alert()、window.location、window.top等。作用域链当代码在一个环境中执行时,会创建一个变量对象的作用域链(由作用域组成的链)。1、作用域链的前端始终是当前执行代码所在环境的变量对象。2.作用域链的下一个对象来自外部环境,下一个变量对象来自下一个外部环境,一直到全局执行环境3.全局执行环境的变量对象永远是最后一个对象在作用域链上。在内部函数中,当需要访问一个变量时,首先会访问函数本身的变量对象。如果有这样的变量,如果没有,则继续向上查找作用域链,直到到达全局作用域。如果在变量对象中找到,则使用该变量对象中的变量值。内环境可以通过作用域链访问所有的外环境,但外环境不能访问内环境的任何变量和函数。变量提升在ES6之前,我们一般使用var来声明变量。变量提升如下:functiontest(){console.log(a)//undefinedvara=123}//其实际执行顺序如下functiontest(){varaconsole.log(a)a=123}test()函数提升在JavaScript中,不仅变量声明被提升,函数声明也被提升。命名函数有两种声明方式:functiondeclarationtypefunctionliteraltype//functiondeclarationtypefunctionbar(){}//functionliteraltypevarfoo=function(){}函数提升就是将整个代码块提升到它上面在作用域开始处执行console.log(bar)functionbar(){console.log(1)//?bar(){console.log(1)}}//实际执行顺序functionbar(){console.log(1)}console.log(bar)闭包闭包是一个可以读取其他函数内部变量的函数。如果函数没有被释放,整个作用域链上的局部变量都会被保留。由于在javascript语言中,只有函数内部的子函数才能读取局部变量,所以闭包可以简单理解为“函数内部定义的函数”。生成闭包创建闭包的最常见方法是在另一个函数中创建一个函数。闭包的作用域链包括它自己的作用域、封闭函数的作用域和全局作用域。functionfn(){vara=1,b=2functionf1(){returna+b}returnf1}上例中的f1是closure闭包的应用1.设计私有方法和变量。函数内部定义的任何变量都可以被认为是私有的,因为它不能在函数外部访问。私有变量包括函数参数、局部变量和函数内定义的其他函数。可以访问私有变量的公共方法称为特权方法。functionAnimal(){//私有变量varseries='mammal'functionrun(){console.log('Run!!!')}//特权方法this.getSeries=function(){returnseries}}2.匿名函数最大的用途是创建闭包。减少全局变量的使用。从而使用闭包将代码模块化,减少全局变量的污染。var对象事件=对象事件||{}(function(){varaddEvent=function(){//一些代码}functionremoveEvent(){//一些代码}objEvent.addEvent=addEventobjEvent.removeEvent=removeEvent})()addEvent和removeEvent是局部变量,但是我们可以通过全局变量objEvent来使用,这样就大大减少了全局变量的使用,增强了网页的安全性。3.定义模块,我们把操作函数暴露在外面,细节隐藏在模块内部。功能模块(){vararr=[];functionadd(val){if(typeofval=='number'){arr.push(val);}}functionget(index){if(index
