变量的声明用var
//显式声明(var i = 100;)
1. 全局变量:在函数外通过var声明的变量。
2. 局部变量:在函数中通过var声明的变量。
//隐式声明(i = 100;)
没有声明就使用的变量,不管在这句话在哪里,都是默认全局变量的赋值
【一】
<script>
a = 1;//默认就是全局变量
function t(){
var b = 5;
a = 6;//相当于window.a重新赋值为6 污染全局变量
alert(a+b);//11
}
t();
alert(a);//最终输出的是6
alert(c);// c is not defined js会报错
</script>
在函数中使用var关键字进行显式声明的变量是做为局部变量,而没有用var关键字,使用直接赋值方式声明的是全局变量。
当我们使用访问一个没有声明的变量时,JS会报错。而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式申明一个全局变量,这一点一定要注意。
变量的作用域
js中函数嵌套比较普遍
变量的查找是就近原则,去寻找var定义的变量,当就近没有找到的时候就去查找外层。
- 首先在函数内找
- 如果找不到 去外层寻找 直到全局window区域
- 不会向内寻找
这个就是函数嵌套的简单例子—看看你能说出正确结果吗?
【二】
<script>
var c = 5;
function t1(){
var d = 6;
function t2(){
var e = 7;
var d = 3;
alert(c+d+e);
}
t2();
}
t1();
</script>
对比两个例子
【三】
<script>
var str1 = "global";//全局变量
function test(){
console.log(str1);//函数内没有str1 就一层层向外访问 global
console.log(str2);//这里会报错str2 is not defined
str2 = "local";//这里赋值 隐式声明为全局变量
}
test();
</script>
在test()函数内寻找str1—没有 又在window寻找 str1 有global
在test()函数内寻找str2—没有 ,又在window寻找 str2 is not defined错误(当我们使用访问一个没有声明的变量时,JS会报错)
【四】
<script>
var str1 = "global";
function test(){
console.log(str1);//window.str1 = global
console.log(str2);//这里是未定义 undefined 不是报错
var str2 = "local";//在函数内声明了
console.log(str2);//这里就可以输出local
}
test();
console.log(str2);
//这里的str2默认是全局的,它不会向内寻找,
//str2 is not defined错误
</script>
js代码自上而下 执行;
但是js代码的整体运行 分为词法分析期 和 运行期。
自上而下没有问题 先有一个词法分析过程 很重要。
先分析 test函数 test() {var str2;} 分析出 test函数内有局部变量 .但是函数未运行,所以str2 是undefined.然后 执行test.所以 str2 undefined,之后赋值str2 = local.然后str2 是local。但是全局的str2仍然是is not defined 出错
最后再看一个很短的代码
【五】
//声明两个全局变量window m n
alert(window.m);//undefined
alert(window.n);//undefined
function t(){
m = 99;//相当于给全局变量赋值
var n = 66;//声明函数内局部变量
}
t();
alert(window.m);//99
alert(window.n);//undefined
第一次写博客,也不知道咋写,就简简单单写一下js中局部全局变量已经作用域吧,可能写的也比较乱,思路不是很清晰,慢慢学习。还望大佬多给意见,谢谢你读完这一篇博客!