title: 变量作用域
date: 2016-11-24 19:58:57
tags: javascript
categories:
- javascript
静态作用域
- 又称此法作用域
- 由程序定义的位置决定
var x = 10 ;
function foo(){
alert(x);
}
function bar(){
var x = 20;
foo();
}
bar()
这里执行foo()函数时,由于其内部没有定义x,程序就会到其外层作用域(全局)寻找
动态作用域
- 由程序运行的时刻决定
JS变量作用域
- js使用静态作用域
- js没有块级作用域(全局作用域,函数作用域)
- ES5中使用词法环境管理静态作用域
词法环境
- 环境记录
- 形参
- 函数声明
- 变量
- 对外部环境的引用(outer)
环境记录初始化-声明提前
全局代码或者函数代码执行前,先把函数声明、变量定义到环境记录里面
词法环境-width
var foo = "abc";
width ({
foo: "bar"
}) {
function f(){
alert(foo);
};
(function(){
alert(foo);
})();
f();
}
with传入一个对象,并把这个对象定义到临时词法环境里面,创建一个临时作用域
这里函数表达式会使用这个作用域,而函数声明还是使用全局作用域
词法环境 try-catch
try{
var e = 10;
throw new Error();
}catch(e){
function f(){
alert(foo);
};
(function(){
alert(foo);
})();
f();
}
catch会创建一个临时环境,执行匿名函数是会使用这个临时环境,而函数声明的环境还是指向全局环境
带函数名称的函数表达式
(function A(){
A = 1;
alert(A);
})()
这里在执行时换创建一个新的词法环境,把A定义到这个环境记录里,并且A无法被修改,所以这里语句 A=1
没有效果