JavaScript 变量作用域

发布于 2024-07-24 16:19:53 字数 2429 浏览 8 评论 0

作用域链

作用域链:JavaScript 需要查询一个变量 x 时,首先会查找作用域链的第一个对象,如果以第一个对象没有定义 x 变量,JavaScript 会继续查找有没有定义 x 变量,如果第二个对象没有定义则会继续查找,以此类推。

下面的代码涉及到了三个作用域链对象,依次是:first、second、thrid。

局部变量优先级 > 全局变量

var arr = 1;
function first () {
	arrs=1000;
	function second () {
		arrs=100;
		function third () {
			var arrs = 10;
			console.log(arr);
		}
		third()		// 调用
	}
	second();		// 调用
}

first();		// 1

JavaScript 没有块级作用域

变量 i、j、k 作用域是相同的,他们在整个 rain 函数体内都是全局的

function rain() {
	// 函数体内存在三个局部变量 i j k
	var i=0;
	if (1) {
		var j = 0;
		for (var k=0; k<3; k++) {
			console.log(k);		// 0,1,2
		}
		console.log(k)			// 3 (k++), 调用未声明变量
	}
	console.log(j);				// 0
}

rain();

函数中声明的变量 var xxx 在整个函数中都有定义。

function ts() {
	var m = 0;
	function tts() {
		console.log(m);		// 0
		m = 1000
	}
	tts();
	console.log(m);			// 1000
}

ts();

在函数 ts2 内局部变量 x 在整个函数体内都有定义( var x= 'rain-man',进行了声明),
所以在整个 ts2 函数体内隐藏了同名的全局变量 x。这里之所以会弹出'undefined'是因为,第一个执行 console.log(x) 时,局部变量 x 仍未被初始化。
等效于:

function rain(){
    var x;
    alert( x );		// undefined
    x = 'beginman';
    alert( x );		// beginman
}

如下:

function ts2() {
	var m = 0;
	function tts() {
		console.log(m);			// undefined
		var m = "good";
	}
	tts();
	console.log(m);				// 0
}

ts2();

未使用 var 的变量属于全局变量

function test1() {
	function chlid() {
		function child_2 () {
			// 未使用 var
			x = 'beginman';
		}
		child_2();
	}
	chlid();

	console.log(x);		// beginman
}
// 调用
test1();
console.log(x);			// beginman

全局变量都是 window 对象的属性

<script type="text/javascript">
    var x = 100 ;
    alert( window.x );//弹出 100
    alert(x);
</script>
等同于下面的代码
<script type="text/javascript">
    window.x = 100;
    alert( window.x );
    alert(x)
</script>

避免使用过多全局变量

避免使用全局变量。努力减少使用全局变量的方法:在应用程序中创建唯一一个全局变量,并定义该变量为当前应用的容器。

var ARRS = {};  // 变量集

ARRS.name = {
	"first_name": "方",
	"last_name": "朋",
};

ARRS.work = {
	number: 1001,
	one: {
		name: "one",
		time: "2014-2015",
		job: "web"
	},
	two: {
		name: "wto",
		time: "2015-2016",
		job: "python"
	}
};

console.log(ARRS.work.one.job);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

坏尐絯℡

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文