变量的作用域?
作用域:某个内容起作用的范围。
全局变量:
- 当在JavaScript中定义变量,在当前script标签中,若在定义该变量前去调用该变量,值是undefined,而在没有定义该变量就去调用该变量是会报错的。原因是所有定义的变量都是先在内存中开辟该变量的存储位置,即变量存储在栈中,当代码解释到该语句时才会将值存在栈中,即值先不做处理,所以调用一个变量时计算机是先去栈中查找有没有该变量,结果发现是有的但没有赋值,所有是undefined。如果该对象没有定义就不会在内存中开辟存储 ,因此就会报错。
- 如果在上一个script中调用下面的script的变量时,这时候不但没有值,而且连存储空间都没有开辟,因此,在上一个script中调用下面其他script中的变量是永远都会报错的。
- 一旦定义变量完成后,在后面的script中都是可以任意调用的,因为这些变量都是全局变量。
函数内定义的变量作用范围是在该函数内,一旦该函数运行完成后,函数内定义的变量将会自动销毁。
函数中是可以修改全局变量的,而此时该全局变量就是改变后的全局变量。在外部调用该全局变量也是修改后的全局变量。
全局变量:就是在script标签下直接使用var定义的变量,全局变量可以应用于所有的代码中调用获取,范围非常大
局部变量:就是在函数中使用var定义的变量,仅用于当前函数的执行范围内
全局变量和局部变量的重名?
如果在函数中定义了某个局部变量名,那么在该函数中所有这个变量都是局部变量。
不能通过直接使用变量名的方法调用外部的全局变量了。
如果全局变量的名称在函数中和局部变量名相同,想要调用全局变量时,需要在变量名前加上window前缀。如window.s1 += 10; 否则就是指该函数下的局部变量。
<script>
var s = 10;
function fn3(){
console.log(s); //此时s打印为undefined,因为只有变量还没有值
s += 10 ;
console.log(s); //打印出的s为NaN,因为是相当于undefined + 10
var s = 20;
}
fn3();
</script>