作用域理解:定义的变量、函数生效的范围。javascript 有全局作用域和函数作用域两种。
注:es6实现let 块级作用域不是js原生的,底层同样是通过var实现的。如果想了解具体细节,请访问babel官方 对es6中let 进行解析。 执行上下文
范围:一段内或者一个函数内; 函数、变量声明提升<script> foo(); //打印a var foo = 1; function foo (){ console.log(’a‘) }; console.log(foo); //1 </script> //实际的执行顺序为 <script> function foo(){ //函数声明优先于变量的声明 console.log("a"); } //var a ; 重复声明,这儿被省略了。 foo(); //打印a foo = 1; //给foo赋值为1 console.log(foo); //1 </script>
当js引擎执行一个 执行上下文代码块时,执行顺序为: 我们习惯将 var a = 2; 看作一个声明,而实际上 JavaScript 引擎并不这么认为。它将 var a和 a = 2 当作两个单独的声明,第一个是编译阶段的任务,而第二个则是执行阶段的任务。这意味着无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理。可以将这个过程形象地想象成所有的声明(变量和函数)都会被“移动”到各自作用域的最顶端,这个过程被称为提升。要注意避免重复声明,特别是当普通的 var 声明和函数声明混合在一起的时候,否则会引起很多危险的问题! 作用域链
自由变量:当前作用域没有定义的变量,但是上层作用域定义了,可以在此层作用域中使用的变量。 块级作用域
js无块级作用域,仅有全局作用域和函数作用域两种作用域。 |