js作用域

1.js的作用域没有块级作用域这一说 只有函数作用域和全局作用域 ,函数可以访问全局中声明的变量

上面说到块级作用域  看第二三个输出  在for语言里面声明输出i=1,然而出了for语句还能输出i ,而在函数体外面输出i报错,所以js只有函数作用域

2.关于预解析

在函数体外先定义了i  在函数体中第一次输出时  输出undefined  而不是99999? 这是因为js中存在预解析  因为函数体后面有声明这个变量所以会提前解析这个变量  输出undefined

3.就近原则输出

输出后定义的那个值

 4.注意一点在函数块内不使用关键字var给变量赋值  那么这个变量就是全局的  但是可以通过delete删除这个变量

作用域链

在调用某个函数时 js会为这个函数建立一个可执行环境,并且每个可执行环境都有一个与之对应的活动对象,环境中的变量和函数都在这个对象中

 js的执行顺序是根据函数的调用来决定的,当一个函数被调用时,该函数环境的变量对象就被压入一个环境栈中。而在函数执行之后,栈将该函数的变量对象弹出,把控制权交给之前的执行环境变量对象。

当代码在一个环境中执行时,会创建以个变量对象的作用域链,作用域链的前端都是当前代码所在环境的执行环境 。 下一个变量对象为外部环境,一直延续下去

如果这个环境是函数  就将其活动对象作为变量对象  活动对象在最开始只包含一个argument对象 。

以上为简单的作用域链查找标识符

作用域链还关系到闭包,this等等

未完待续

优秀总结博文

https://blog.csdn.net/whd526/article/details/70990994