JS作用域笔记0

  1. 看一下代码:

    var a = 'Amy';
    function fun(){
      console.log(a);//undefined
      var a = 'Jane';//该变量a为局部变量
      console.log(name());//Jane
      function name(){
        return a;
      }
    }
    fun();//undefined  Jane
    
     上面第一个输出undefined,输出的a是fun函数里的局部变量a,虽然在函数里局部变量a在后一行,但是在这是进行了声明提升,也就是先声明了局部变量a,但还没赋值,所以输出undefined,相当于以下代码:
    
var a = 'Amy';
  var a;//先声明局部变量a
  console.log(a);//undefined
  a = 'Jane';//然后再为该局部变量a赋值'Jane'
  console.log(name());//Jane
  function name(){
    return a;
  }
}
fun();//undefined  Jane

2.再看以下代码

var a = 'Amy';
function fun(){
  a = 123;//这里的a为局部变量a
  console.log(a);//123
  var a = 'Jane';
  console.log(a);//Jane
  name();
  function name(){
    console.log(a);//undefined
    var a = 'Tommy';//该变量a为name函数的局部变量
    console.log(a);//Tommy
  }
}
console.log(a);//Amy
fun();//123  Jane  undefined  Tommy
console.log(a);//Amy
	上面代码,为什么fun函数里第一行的a不会改变全局变量a的值?因为这fun函数里的第一行a改变的是第5行局部变量a的值,相当于以下代码:
var a = 'Amy';
function fun(){
  var a;//先声明局部变量a
  a = 123;//为局部变量a赋值
  console.log(a);//123
  a = 'Jane';//修改局部变量a的值
  console.log(a);//Jane
  name();
  function name(){
    console.log(a);//undefined
    var a = 'Tommy';//该变量a为name函数的局部变量
    console.log(a);//Tommy
  }
}
console.log(a);//Amy
fun();//123  Jane  undefined  Tommy
console.log(a);//Amy

3.看以下代码:

var b = 321;
        function fun1(){
            console.log(b);
            b = 456;
            console.log(b);
        }
console.log(b);//321

上面代码没有调用fun1函数,所以只输出结果321

当调用fun1函数:

var b = 321;
        function fun1(){
            console.log(b);//输出的是全局变量b的值
            b = 456;//改变的是全局变量b的值
            console.log(b);//输出的是全局变量b的值
        }
fun1();//321  456  
console.log(b);//456

上面代码调用了fun1函数后,全局变量b的值被改变。


4.看以下代码

var b = 321;
        function fun1(){
            console.log(b);//undefined
            var b = 456;//局部变量b
            console.log(b);//456
        }
fun1();//undefined 456
console.log(b);//321

上面代码第3行输出的是局部变量b,因为在该fun1里局部变量声明提前,所以在声明了变量但还未赋值,会输出undefined,赋值后才输出456。最后一行输出的是全局变量b的值。

posted on   不叫灯笼椒  阅读(27)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示