js声明变量

计算机安全中,有个常规的原则:用户只能访问他们当前须要的东西。javascript

程序设计中,一般会有一个原则:当即返回原则,也称短路计算。html

ES6 声明变量的六种方法java

ES5 只有两种声明变量的方法:var命令和function命令。ES6除了添加letconst命令。还有另外两种声明变量的方法:import命令和class命令。因此,ES6 一共有6种声明变量的方法。git

理解声明变量,得先了解下做用域。JavaScript只有函数做用域和全局做用域,ES6引入块级做用域es6

做用域内变量提高(var),与变量的声明位置无关。可是变量应该是在声明的时候才使用呀,ES6 let纠正了这种奇怪的状况。web

变量绑定,函数做用域内申明了跟全局同名变量,只要函数做用域声明该变量,它所声明的变量就"绑定"在该区域了,再也不受外部影响。编程

变量篡改,全局做用域容易被篡改数组

暂时性死区,若是区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就造成了封闭做用域。凡是在声明以前就使用这些变量,就会报错。安全

 

  • 全局做用域中申明变量能够省略var,函数体内申明变量不带var则认为是全局变量
  • 函数做用域内var与全局相同的变量,该函数体内scope直接访问局部变量,而没法指向全局变量。
  • let不作变量提高,须要先声明再调用,不然会报错。
  • let声明的变量,做用域最小到变量声明的块级,永远最小(例如循环语句)。
  • let在同一个块级做用域内不能够重复声明
  • 函数里面的this,若是函数不是做为对象的方法运行,而是单纯做为函数运行,this会指向顶层对象。可是,严格模式下,这时this会返回undefined
  • 函数体内的变量,能够经过闭包语法访问。
  • const声明一个只读常量,声明变量和初始化值必须在一块儿,不可修改。
  • const只是代表指向的地址不可变,当const一个对象时,对象参数是能够修改的,包括数组。Object.freeze冻结对象。
  • var声明的变量,执行方法的时候无论声明方法的位置,变量的值调用时才确认。
  • 块级做用域是一个语句,多个操做封装在一块儿,并无返回值。使用do语句能够得到返回值(本身动手并未实现该效果)。
  • let经常使用到块级做用域,好比for、if(var会将块级做用域的变量提高到函数或者全局做用域,var会污染全局变量),let相较var更严谨一点。
  • 全局做用域容易被篡改,即变量覆盖。因此在声明变量的时候都要使用关键字进行声明。
  • let在全局做用域声明变量,没法经过顶层对象window.x访问。
  • this绑定的值定义的执行上下文。

词法做用域,函数的执行语句在函数内运行,而不是在执行它的做用域内运行。即每一个做用域内的变量是相互独立的,全局做用域除外(变量提高的坑)。闭包

变量值的绑定,向外部逐渐扩展,返回查询到的第一个值,结束搜索。

闭包,定义在函数内部的函数,做为子函数用来让外部读取函数内部的局域变量,链接函数内外部。

 

参考资料:

1.ES6标准入门(阮一峰)http://es6.ruanyifeng.com/#docs/let

2.默语博客http://www.cnblogs.com/syfwhu/p/4839562.html

3.理解 Javascript 中变量的做用域(伯乐在线):http://web.jobbole.com/82599/?utm_source=blog.jobbole.com&utm_medium=relatedPosts

4.学习Javascript闭包(阮一峰):http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

5.函数式编程入门教程(阮一峰):http://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html

6.JS函数式编程指南(gitbook):https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/

相关文章
相关标签/搜索