当 全局变量 和局部变量 重名时:
在全局作用域中没有什么冲突影响,访问到肯定是:全局变量。
但是 !在局部作用域,优先访问到的是:局部变量,除非在局部作用域中,没有这个(var)名字的局部变量,访问到的是全局变量。
// 1.全局变量
var num1 = 10;
console.log(num1);//10
var num2 = 20;
console.log(num2);//20
var num3 = 30;
console.log(num3);//30
// 2.局部变量
function fn1(num2) {
console.log(num1);//undfined
console.log(num2);//40
//局部变量
var num1 = 50;
console.log(num1);//50
console.log(num2);//40
console.log(num3);//30
//改变局部变量的值
num1 = 50;
console.log(num1);//50
num2 = 60;
console.log(num2);//60
num3 = 70;
console.log(num3);//70 已经改变全局变量的值 现在是70
console.log(window.num1);//10
console.log(window.num2);//20
console.log(window.num3);//70
}
fn1(40);
console.log(num1);//10
console.log(num2);//20
console.log(num3);//70
console.log('-----------------华丽的分割线--------------');
console.log(n1);//undefined
var n1 = 1;
console.log(n1);//1
function fn2(n1) {
console.log(n1);//undefined
var n1 = 3;
console.log(n1);//3
n1 = 4;
console.log(n1);//4
console.log(window.n1)//1;
}
fn2(2);
console.log(n1);//1
如果声明变量没有使用var关键字,则声明的变量是一个全局变量。
如果在函数内部声名变量没有使用var关键字:
1.首先会查找 函数在内部 是否存在用var关键字声明过这个变量,如果有就是这个局部变量的更改。
2.如果没有就会向上层作用于查找是否存在 用var关键字声明过这个变量,如果有就是这个局部变量的更改。
3.如果没有值直接就是一个全局变量,但是这个全局变量只能存在变量赋值后面使用,在之前使用就会报错。
//console.log(s1);//Error: s1 is not defined
s1 = 6;
console.log(s1);//6
function fn3() {
console.log(s1);//6
//console.log(s2);// Error: s2 is not defined
s2 = 8;
console.log(s2);//8
}
fn3();
console.log(s2);//8