js-----初步了解变量 作用域

来源:互联网 发布:新疆知信科技有限公司 编辑:程序博客网 时间:2024/06/06 02:26

变量的声明用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定义的变量,当就近没有找到的时候就去查找外层。

  1. 首先在函数内找
  2. 如果找不到 去外层寻找 直到全局window区域
  3. 不会向内寻找

这个就是函数嵌套的简单例子—看看你能说出正确结果吗?

【二】

<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 nalert(window.m);//undefinedalert(window.n);//undefinedfunction t(){    m = 99;//相当于给全局变量赋值    var n = 66;//声明函数内局部变量}t();alert(window.m);//99alert(window.n);//undefined
    第一次写博客,也不知道咋写,就简简单单写一下js中局部全局变量已经作用域吧,可能写的也比较乱,思路不是很清晰,慢慢学习。还望大佬多给意见,谢谢你读完这一篇博客!