javaScript作用域,自由变量
- 自由变量:在A的作用域下使用变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于作用域A来说,x就是一个自由变量。
var x;
function fnA(){
x = 1;
b = x;
}
- js作用域及作用域链
- 定义:作用域也称为执行环境。
- 当代码在一个环境中执行时,会为变量对象创建一个作用域链,这个作用域链会保证对执行环境有权访问的所有变量和函数的有序访问。
(每一个执行环境都有与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中,我们编写的代码无法访问)。 - 内部环境可以通过作用域链访问所有外部环境,但外部环境不能访问内部环境的任何变量和函数。
- 执行环境也成为作用域,执行环境决定了变量的生命周期。
var name = 'name1';
function changeName(){
var anotherName = 'name2';
function changingName(){
var temp = anotherName ;
anotherName = name ;
name = temp ;
//作用域1
}
changingName();
//作用域2
}
changeName();
//作用域3(全局环境)
作用域链实际上就是我们可以通过它从前端到末端可以访问的范围。
3. 面试题的练习
类型一
function aaa(){
var a=10;
};
aaa();
alert(a); //
var a=10;
function aaa(){
alert(a);
};
function bbb(){
var a=20;
aaa();
}
bbb(); //
类型二
function aaa(){
a=10;
}
aaa();
alert(a); //
function aaa(){
var a=b=10;
}
aaa();
alert(a); //
alert(b); //
类型三
function aaa(){
alert(a);
var a=20;
}
aaa(); //
var a=10;
function aaa(){
alert(a);
var a=20;
}
aaa(); //
可以解析为:
var a=10;
function aaa(){
var a;
alert(a);
a=20;
}
aaa();
类型四
var a=10;
function aaa(a){
alert(a);
var a=20;
}
aaa(a);
类型五
var a=[1,2,3];
var b=a;
b.push(4);
alert(a);
当b重新被赋值的时候 a不会改变.示例:
var a=[1,2,3];
var b=a;
b=[1,2,3,4]
alert(a);