JavaScript作用域

本文介绍了ECMAScript和JavaScript的关系,ECMAScript是标准化脚本语言,JavaScript是其实现和扩展。还提到ES6新增了块级作用域,由 { } 包括。同时阐述了var、let、const的区别,var可跨块访问,let和const只能在块作用域访问,const还需初始化且不能修改。

首先,ECMAScript和JavaScript关系:
ECMAScript是一个国际通过的标准化脚本语言。JavaScript由ECMAScript和DOM、BOM三者组成。可以简单理解为:ECMAScript是JavaScript的语言规范,JavaScript是ECMAScript的实现和扩展

  1. 块作用域{ }
    JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称ES6)中新增了块级作用域。
    块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。
<script type="text/javascript">
	{
		var a = 1;
		console.log(a); // 1
	}
	console.log(a); // 1
	// 可见,通过var定义的变量可以跨块作用域访问到。

	(function A() {
		var b = 2;
		console.log(b); // 2
	})();
	// console.log(b); // 报错,
	// 可见,通过var定义的变量不能跨函数作用域访问到

	if(true) {
		var c = 3;
	}
	console.log(c); // 3
	for(var i = 0; i < 4; i++) {
		var d = 5;
	};
	console.log(i);	// 4   (循环结束i已经是4,所以此处i为4)
	console.log(d); // 5
	// if语句和for语句中用var定义的变量可以在外面访问到,
	// 可见,if语句和for语句属于块作用域,不属于函数作用域。
</script>
  1. var、let、const的区别
    var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
    let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
    const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
<script type="text/javascript">
	// 块作用域
	{
		var a = 1;
		let b = 2;
		const c = 3;
		// c = 4; // 报错
		var aa;
		let bb;
		// const cc; // 报错
		console.log(a); // 1
		console.log(b); // 2
		console.log(c); // 3
		console.log(aa); // undefined
		console.log(bb); // undefined
	}
	console.log(a); // 1
	// console.log(b); // 报错
	// console.log(c); // 报错

	// 函数作用域
	(function A() {
		var d = 5;
		let e = 6;
		const f = 7;
		console.log(d); // 5
		console.log(e); // 6  (在同一个{ }中,也属于同一个块,可以正常访问到)
		console.log(f); // 7  (在同一个{ }中,也属于同一个块,可以正常访问到)

	})();
	// console.log(d); // 报错
	// console.log(e); // 报错
	// console.log(f); // 报错
</script>

作者:hot_cool
来源:优快云
原文:https://blog.youkuaiyun.com/hot_cool/article/details/78302673
版权声明:本文为博主原创文章,转载请附上博文链接!

作用域(Scope)是指在代码中定义变量时,这些变量在哪里以及在哪些地方可以被访问,控制着变量的可见性和生命周期。在 JavaScript 中,作用域的类型主要由函数定义和代码块定义来决定[^2]。以下是 JavaScript 作用域的类型介绍: - **全局作用域**:在 `<script>` 标签中或者 js 脚本中定义的变量属于全局作用域。全局作用域中的变量可以在代码的任何地方被访问[^3]。 ```javascript var globalVar = 'I am a global variable'; function testGlobal() { console.log(globalVar); // 可以访问全局变量 } testGlobal(); ``` - **局部作用域**:在函数中定义的变量属于局部作用域,使用 `var` 关键字声明,这些变量只能在函数内部被访问,函数外部无法直接访问这些变量[^3]。 ```javascript function testLocal() { var localVar = 'I am a local variable'; console.log(localVar); // 可以在函数内部访问局部变量 } testLocal(); console.log(localVar); // 报错,无法在函数外部访问局部变量 ``` - **块作用域**:ES6 中在 `{}` 代码块中使用 `let` 或 `const` 定义的常量、变量属于块作用域;而 ES6 之前使用 `var` 关键字在 `{}` 代码块中定义的变量,取决于代码块位置,代码块在全局作用域则该变量属于全局作用域,代码块在局部作用域则该变量属于局部作用域[^3]。 ```javascript // 使用 let 声明,具有块级作用域 if (true) { let blockVar = 'I am a block variable'; console.log(blockVar); // 可以在代码块内部访问 } console.log(blockVar); // 报错,无法在代码块外部访问 // 使用 var 声明,没有块级作用域 if (true) { var oldStyleVar = 'I am declared with var'; } console.log(oldStyleVar); // 可以访问 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值