作用域:
全局作用域:最外层定义的变量
局部作用域:只在固定的代码片段内可用,函数外出不可访问
js没有块级作用域,局部作用域数有函数的产生而产生的;也叫函数作用域
注意:建议使用var声明变量,如果没有var声明,那么在函数内也是声明了全局变量。
块级作用域:{}
function test() {
a = 10;
console.log(a);
}
test();
console.log(a);
js执行环境
全局执行环境:最外面层的执行环境---->window
因此所有的全局变量和函数都作为window的属性和方法。Go
局部执行环境:函数内的执行环境----->Ao
js三部曲
1.语法检查
2.预编译
3.逐行解释执行
预编译:
发生的时刻:函数执行的前一刻和全局下
过程:
1.创建AO对象(active , object, this, argument)
2.在函数内找用var定义的变量级形参变量,并赋值为undefined
3.形参和实参先统一
4.找函数内用function定义的函数,并将函数体赋值。
// 例题;
function test(a) {
console.log(a); //function
var aa = 345;
console.log(aa); //345
var a = 6;
console.log(a); //6
function a() {
console.log(a); //6
var cc = 456;
console.log(cc); //456
}
a();
}
test(4);
// AO{
// this:window
// arguments:[4];
// aa:345
// a:6
// }
// Go{
// test:function
// }
作用域链:
当一个函数被调用的时候,创建了执行环境和相应的作用域链,并且把作用域链赋值给一个特殊的内部属性[[scope]],然后用this,arguments(全局不存在),和其他的命名参数来初始化活动对像,当前的执行环境始终在作用域链的最顶端
[[scope]]中所存储的执行期上下文的集合,这个集合呈链式结构,我们把这种链式叫做作用域链。也是作用域对像的集合。
var a = 10;
function test(c,d) {
var b = 20;
function aa() {
}
aa();
}
test(4);
// aa-AO{
// this:window
// arguments
// }
// test-AO{
// this:window
// arguments:[4]
// b:20
// c:4
// d:undefined
// aa:function
// }
// GO{
// a:10
// test:function
// }