作用域
理解:在什么范围内,定义的变量,作用在词法阶段
两种:全局作用域、函数作用域
- 在函数作用域里面可以访问全局作用域中的变量,但是反过来不行
- 函数中定义的变量,就是局部变量,变量只在函数内可见
- 作用域嵌套的情况:a)全局作用域和函数作用域 的嵌套
- b)函数作用域和其他函数作用域 的嵌套
全局作用域和函数作用域 的嵌套实例
a)全局变量可以在函数内使用示例:
// 全局变量
var c = '好吃的油炸代码';
function test(){
// 在函数内,访问全局变量 c
console.log(c);
}
// 执行
test()
展示执行:
b)函数局部变量不能在全局变量中使用。
// 在全局内 访问函数内 局部变量
function test(){
var d = '函数内的变量';
}
console.log(d);
结果展示:
作用域在分词阶段的示例理解:
如下实例:因为作用域在分词阶段,所以以下代码分词后,是有c变量的,但是执行阶段不会执行 c='好吃的油炸代码'的赋值语句。所以执行结果是 未定义的undefined,而不是报错。
if(false){
var e = '好吃的油炸代码'
}
console.log(e);
实例展示:
函数作用域和其他函数作用域示例:
示例1:
说明:变量h在全局中定义赋值了,在函数testHet内的其他函数inner执行时,用到了h变量,查询时,会先在inner函数内找,找不到在到父函数testHet内找,还找不到再到全局中找,因此找到的是全局的h,全局的h变量有值,所以以下代码执行结果是:好吃的油炸代码
// 函数内嵌套其他函数
var h = '好吃的油炸代码'
function testHet(){
var inner = function(){
console.log(h);
}
inner();
}
testHet();
展示:
示例2:
说明:变量h2 在全局中定义赋值了
变量h2 在函数testHet中定义了,没赋值
在函数testHet内的其他函数inner执行时,用到了h2变量,查询时,会先在inner函数内找,找不到在到父函数testHet内找,找到了就不再上溯再找,所以执行结果是:undifend
// 函数内嵌套其他函数
var h2 = '好吃的油炸代码';
function testHet(){
// 内部定义个h2
var h2;
var inner = function(){
console.log(h2);
}
inner();
}
testHet();
展示结果:
示例3:
说明:变量h3 在全局中定义赋值了
变量h3 在函数inner中定义了,且赋值为“新的值”
在函数testHet内的其他函数inner执行时,用到了h3变量,查询时,会先在inner函数内找,找到了就不再上溯再找,所以执行结果是:新的值
// 函数内嵌套其他函数
var h2 = '好吃的油炸代码';
function testHet(){
var inner = function(){
// inner内部定义个h2
var h2='新的值';
console.log(h2);
}
inner();
}
testHet();
展示结果: