JavaScript作用域与作用域链

变量作用域

一个变量的作用域是变量被定义的这个区域。全局变量具有全局作用域,在JavaScript代码中的任何地方都是有定义的。在函数内部定义的变量具有局部作用域,,同名的局部变量比全局变量具有更高的优先级。

var scope = "global";
function checkscope() {
    var scope = "local";
    return scope;
}

console.log(checkscope());  //local

函数作用域与声明提前

C/C++等语言所使用的是块级作用域,花括号中的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不开见的。而JavaScript使用的是函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。
JavaScript的函数作用域意味着变量在声明之前甚至已经可用。JavaScript这个特性被称为“声明提前”,即函数内声明的所有变量(不涉及赋值)都会被提前到函数体顶端。

var scope = "global";
function f() {
    console.log(scope);   //undefined
    var scope = "local";
    console.log(scope);   //local
}
f();

由于声明提前,因此第一个输出可以输出scope变量,但此时scope有定义却未被初始化。当代码执行到var语句时才对scope进行了初始化,第二个输出得到local。上述代码等同于如下代码:

var scope = "global";
function f() {
    var scope;
    console.log(scope);   //undefined
    scope = "local";
    console.log(scope);   //local
}
f();

作用域链

每一段JavaScript代码(全局或函数)都有一个与之关联的作用域链(scope chain)。这个作用域链是一个对象列表或者链表,这组对象定义了这段代码作用域中的变量,也就是可以访问的变量构成的对象。当JavaScript代码查找某个变量时,它会从链中的第一个对象(或者说链顶端)开始查找,找到则返回;找不到则顺着作用域链下一个对象继续查找,直到作用域链上任何一个对象都没有这个变量,则抛出引用错误异常。
如下代码:

var variable = 'global';
var global_variable = 'global_variable'
function f() {
    var variable = 'local';
    var local_variable2 = 'local_variable2';
    console.log(variable);        //local
    console.log(local_variable2); //local_variable2
    console.log(global_variable); //global_variable
}

f();

函数f的作用域链如下图所示:
查找时首先查找当前声明上下文对象,即f函数内部,如果找不到再查找作用域链的上一级,由于此处是全局直接调用f,则上一级就是window,否则就是调用f的函数。
函数f的作用域链

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值