JavaScript:变量作用域

本文深入解析JavaScript中的全局作用域与函数作用域,探讨如何避免全局变量冲突,介绍let与const关键字的使用,以及它们如何提供块级作用域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript的变量只有两种作用域:

  • 全局作用域
  • 函数作用域

如果一个变量没有通过var声明就被使用,那么该变量就自动被声明为全局变量。可以通过启用strict模式来强制var声明。方法是在JavaScript代码的第一行写上:

'use strict';

全局作用域

不在任何函数内定义的变量具有全局作用域。实际上,JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性:(直接调用的alert()函数其实也是window的一个属性。)

var course = 'Learn JavaScript';
alert(course);         // 'Learn JavaScript'
alert(window.course);  // 'Learn JavaScript' 
名字空间

全局变量会绑定到window上,不同的JavaScript文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,会造成命名冲突,并且很难被发现。

减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中。例如:

// 唯一的全局变量MYAPP:
var MYAPP = {};
 
// 其他变量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
 
// 其他函数:
MYAPP.foo = function () {
    return 'foo';
};

把自己的代码全部放入唯一的名字空间MYAPP中,会大大减少全局变量冲突的可能。
许多著名的JavaScript库都是这么干的:jQuery,YUI,underscore等等。

局部作用域(函数作用域)

如果一个变量在函数体内部声明,则该变量的作用域为整个函数体,在函数体外不可引用该变量。

JavaScript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行。
JavaScript的函数在查找变量时从“内”向“外”查找。如果内部函数定义了与外部函数重名的变量,则内部函数的变量将“屏蔽”外部函数的变量。

let关键字

由于JavaScript局部变量的作用域实际上是函数内部,我们在for循环等语句块中是无法定义具有块作用域的变量的:

'use strict';
 
function foo() {
    for (var i=0; i<100; i++) {
        //
    }
    i += 100; // 仍然可以引用变量i
}

为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量:
在火狐中,新特性可能需要包在<script type="application/javascript;version=1.7">语句块中。

<script type="application/javascript;version=1.7">
'use strict';
 
function foo() {
    var sum = 0;
    for (let i=0; i<100; i++) {
        sum += i;
    }
    i += 1; // SyntaxError
}
</script>

常量

ES6标准引入了新的关键字const来定义常量,constlet都具有块级作用域:

'use strict';
 
const PI = 3.14;
PI = 3; // 某些浏览器不报错,但是无效果!
PI;     // 3.14

转载于:https://www.cnblogs.com/xuejianbest/p/10284978.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值