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

变量的声明用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 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中局部全局变量已经作用域吧,可能写的也比较乱,思路不是很清晰,慢慢学习。还望大佬多给意见,谢谢你读完这一篇博客!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值