告别拖延症,今天开始更新ES6-ES10常用的所有新特性,就当学习笔记,勿喷。目录ECMAScriptECMAScript概述ES2015概述新特性分类作用域全局作用域函数作用域块级作用域(ES6新特性)动态作用域ES6-ES10学习布局ECMAScriptECMAScript概述ECMAScript通常被认为是JavaScript的标准化规范,实际上JavaScript是ECMAScript扩展语言。ECMAScript只提供了最基本的语法。JavaScript=ECMAScript+BOM+DOM从2015年开始,ES保持每年一个版本的迭代,并开始按照年份命名。ES2015概述与ES5.1相比,变化比较大。从那时起,标准命名规则发生了变化。ES6泛指2015年以后的所有新标准,以后具体是泛指还是泛指新特性的分类,解决原有的语法问题就很清楚了。一些问题或不足增强原有语法新对象、新方法、新函数新数据类型和数据结构if语句,for语句)这个动态作用域全局作用域全局使用var定义的变量作为全局变量案例1:varabc=1234abcd=2345deleteabc//falseconsole.log(abc)//1234deleteabcd//trueconsole.log(abcd)//abcd没有定义//abc是一个全局对象,但是abcd不是一个全局变量,而是作为window对象的一个??属性存在的,//但是因为window是一个全局对象,所以好像也有全局属性andglobalscopeCase2:functiontest(){ab=45}test()console.log(ab)//45//in函数内部没有使用var定义的变量挂载到window上。它们不是全局变量,但具有全局作用域。函数内部定义的变量有函数作用域/局部作用域functiontest(){vara=3returna+4}console.log(test())//7console.log(a)//aisnotdefinedHowto在函数范围内创建一个,但共享一些值?returnclosureblocklevelScope(newinES6)ES5//ES5functiontest(){vara=3if(a===3){varb=4console.log('abc')}else{console.log('abcd')}console.log(b)//4returna+4}//if块中不能形成障碍,定义在{}中的变量仍然可以在外面使用//ES6will{}是独立的functiontest(){vara=3functiontest2(){varb=4returna+b}returntest2}/*test中的变量与test2共享,a的值可以是作用域链根据函数获取:执行test2中的函数,先定义b,然后在return中找a,如果没有找到,就去上一个函数找a,如果找到a,如果找不到a在测试中,它最终总是会找到window*/ES6functiontest(){vara=3if(a===3){letb=4console.log('abc')}else{console.log('abcd')}console.log(b)//bisnotdefinedreturna+4}//如果想使用blockscope,但是此时不能使用var,因为var有变量提升机制。//每当看到var,它就会被提升到当前作用域的顶层,所以只能用let,const动态作用域这是一个很特殊的关键字标识符,在每个函数的作用域中自动创建。变量的范围只能在执行阶段确定。window.a=3functiontest(){console.log(this.a)}test()//3test.bind({a:100})()//100//因为这是动态点,不是固定点观点。所以我们称之为动态作用域。//bind是将函数动态绑定到一个对象上。这时候this指向的是对象本身,所以同一个函数会有不同的效果。词法作用域js采用词法(静态)作用域,所以请使用bind、with、eval等启用动态作用域。Bash使用动态作用域、静态作用域和动态作用域。变量的作用域是在定义时确定的,而不是在执行时确定的,一般可以通过静态分析来确定。变量的范围只能在执行阶段确定。//经验证,js默认使用静态作用域//调用foo时在当前函数作用域中没有找到a,所以按照写代码的顺序寻找外层,即vara=2,改为在bar函数中寻找它functionfoo(){console.log(a)//2}functionbar(){vara=3foo()}vara=2bar()学习布局
