javascirpt中没有块级作用域
var i=10;
if(i>1)
{
var name='henry';
}
console.log(name);//henry
for(var i=0;i<10;i++)
{
//...
}
console.log(i);//10
javascirpt中仅两种作用域:全局作用域,函数作用域
javascirpt中除了全局作用域,只有函数可以创建作用域
作用域有上下级之分,上下级关系的确定就看函数是在哪个作用域下创建,如下,fn就是bar函数的上级作用域。
作用域的最大用处就是隔离变量,不同作用域下的同名变量不会有冲突
var a=10, //全局作用域
b=20;
function fn(){ //fn作用域
var a=100,
c=200;
function bar(){ //bar作用域
var a=300,
d=4000;
}
}
如上代码,js的作用域在函数定义时就已经确定了,而不是在函数调用时确定
作用域是一个抽象的概念,其中没有变量,要通过作用域对应的执行上下文环境来获取变量的值。
同一个作用域下,不同的调用会产生不同的执行上下文环境,因为调用的参数不同。所以,作用域中变量的值是在执行过程中产生的,而作用域是在函数创建时就确定了。
如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。