入门 - 变量作用域

  • 作者:KK

  • 发表日期:2016.2.20


代码中声明的变量是有作用范围的,超出范围就不起作用了,这个术语称为作用域(你理解为作用区域就是咯)

一般就是函数外面不能使用函数里面的变量,比如:

var age = 222;

function test(){
	var age = 777;
	alert(age);
}

alert(age);

输出222,因为这是使用外面的age变量,无法使用函数里面的age变量;并且注意,函数只是一个定义,并没有任何代码去调用这个函数,所以函数里声明变量和alert都不会执行

所以这个函数里面定义了什么什么变量关外面什么事呀对吧


而函数也是的,可以在一个函数里面定义另一个函数,但是里面的函数一般不能被外面调用

function aa(){
	alert('这里是aa函数');
	function bb(){
		alert('这里是aa的bb函数');
	}

	bb();
}

bb();	//无效,因为bb函数的作用域是aa函数区域内,除非你改成调用aa函数,靠aa函数来调用bb

但是函数里面可以使用外面的变量

function test(){
	alert(age);
}

var age = 999;
test();

因为当函数在自己的函数体找不到变量时,就会自动往外面找变量

另外上面例子中把函数放在最顶上是告诉你,函数的定义放在哪个位置无所谓,重点是它什么时候被调用执行

函数也是一样,你始终都可以认为函数都是一种变量,所以里面的函数总是可以调用外面的函数的,包括上面小节中bb函数也可以调用alert呀


全局作用域

当一个变量/函数可以在任何位置都被访问调用的时候,它就是一个全局变量/全局函数,比如alert函数就是一个全局函数

JS里预先设置了好多全局函数,包括alert,confirm,prompt,parseInt,Number,isNaN,typeof等等根本就是数不清

我们也可以自己创建全局变量和全局函数,其实我们也已经创建过很多次

当一个变量在声明时没有被任何函数包住的时候,它就是一个全局变量,否则就是局部变量

<script>
var a = 123; //声明时没有被任何函数包住,所以是全局变量

function xxx(){ //而函数定义时也没有被其它任何函数包住,所以这个也是全局函数,可以被任何地方调用

	var b; //声明时被xxx函数包住了,所以这个是局部变量,一旦离开xxx函数体就不是它的天下了,外面也访问不了它

	alert(a); //访问全局变量a,成功提示123
}

xxx();

alert(b); //如果在全局区域尝试访问xxx函数里面的局部变量b就会导致脚本引擎出错,不会出现提示
</script>

全局的东西可以跨标签访问,而不是只能在一个标签里到处调用:

<script>
var a = 111;
function b(){
	alert('函数b');
}
</script>

<script>
alert(a); //调用上一个script标签产生的全局变量a
b(); //不废话了,你懂的
</script>

作用域的坑点

如果你声明函数时不用var关键字就会被坑,代码会出现问题的

至于具体嘛,后面学到window对象这个章节的时候再说吧,一般人我不告诉他

前面也提醒过你了,听我的就是,只要你创建变量,都加上var关键字准没错儿