javascript执行环境以及作用域链的理解
在javascript脚步语言中执行环境有两种:
全局环境:
局部环境:
我们可以拿一个田径跑道来打比方,全局环境就可以理解为是最外面跑道,它包含着内部所有的东西,有人在跑步,有人在跳远,这些用着不同特色方法比赛的人都在这个跑道里面,被全局环境包含着
那么在浏览器当中,全局也被认作是window,所有活动在内的都被视作为是window对象内的
而局部环境往往在函数被创建的时候拥有.当一个环境被创建执行,它内部的代码块就拥有独立的作用域,也就是说javascript规则定义了函数内部的运行规范,我们应该根据它定义的来进行操作.
那么javascript给函数内部定义了什么样的规则呢?我们简单来理解下反而更容易接受.
1.在函数被创建的时候,会自动生成this,args对象,(后面着重解释)
2.在函数内部的所有属性方法我们都称它为活动对象
3.函数内部的有权访问规则,它只能访问包含于它环境当中的活动变量,我们用一个访问变量的过程来体会下这个规则
var name="javascript";
function example(){
console.log(name);
}
example();
在全局环境中定义了一个变量name,和一个函数方法example
我们在函数内部并没有定义变量name,但是执行结果就是变量name的值;这样一来我们就可以看出在这个局部环境当中这个作用域的初始规则,它是可以访问函数外层的变量
说到这,我们来用局部环境访问变量的形式来理解下javascript的访问执行过程.
简单来理解: 从访问源开始,也就是哪里调用访问的开始,上面的代码是从函数内部调用变量name;那么javascript的规则就是,从调用的地方开始向上查询,先在函数体内部查询该变量,如果找到立马停止查询,没有找到它会自动跑到上一个包含环境当中去找,在这里上一级的包含环境就是全局环境,如果上一级还没找到,就会继续往上一级包含环境中去找,直到查询到全局环境当中,如果还没有找到,就会返回undefined
这样一来,上面在函数体内部并没有找到该变量,但是往上一级全局环境中找到了,就会打印出来.
例:在上面函数中定义变量name="javascript2";那么执行结果就为:javascript2
当然,javascript规定,包含环境是不允许访问它下级局部环境的活动对象的,例如:在全局环境当中直接打印函数内部变量
console.log(js);
function (){
var js="javascript";
}
此时javascript是找到不变量js的,这就是javascript的执行环境访问规则