变量作用域及垃圾收集

本文详细探讨了JavaScript中的变量作用域,包括全局变量和局部变量,以及参数传递的原理。接着,介绍了作用域链的概念,解释了如何通过延长作用域链来访问不同环境的变量。此外,文章深入讨论了闭包的特性和应用场景,以及其在内存管理中的角色,特别是闭包的优缺点和内存消耗问题。最后,简述了JavaScript的垃圾收集机制,包括标记清除和引用计数两种策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

变量作用域
全局变量:在js里定义在函数和代码块外部的叫做全局变量
局部变量:在对象体内定义变量的叫做局部变量
参数的传递
(1)基本类型传递的传递,传递的是值
例如:

var x=5
function fun(x){
  document.writeln("1:"+x+"<br>")//5
  x=3
  document.writeln("2:"+x+"<br>")//3
}
fun()
document.writeln("3:"+x+"<br>")//3

(2)引用数据类型的传递,传递的是地址
例如:

var emp={x:5}
var fun=function(emp){
document.writeln(emp.x+"<br>")//5
  emp.x=3
  document.writeln(emp.x+"<br>")//3
}
fun(emp)
document.writeln(emp.x+"<br>")//3

执行环境和作用域
作用域链:当代码在一个环境中执行时,会创建变量对象的yoga作用域链,用来保证对执行环境有权访问的所有变量和函数的有序访问
执行环境和作用域
作用域链:当代码在一个环境中执行时,会创建变量对象的yoga作用域链,用来保证对执行环境有权访问的所有变量和函数的有序访问
例如:

var a=11;
  function fun1(){
  var b=22;
  function fun2(){
      var c=33;
  document.writeln("fun2:"+a+","+b+","+c+"<br>")
 }
fun2()
document.writeln("fun1:"+a+","+b+"<br>")
}
fun1()
document.writeln("全局:"+a+"<br>")
备注:在不同环境下,所访问到的变量环境也不相同

特殊情况 js没有块级作用域

  if(true){//if代码块
  var c="aaa"

}
document.writeln(c+"<br>")//可以访问if里面的变量
for(var i=1;i<=5;i++){//for 代码块
  document.writeln(i)
}
document.writeln("循环外:"+i+"<br>")//可以访问for里面的变量

延长作用域链
虽然js里只有全局和局部函数,但是我们可以用其他方法延长作用域链

   function Emp(name,age){
this.name=name;
 this.age=age;
}
var p=new Emp("lilt",23)
document.writeln(p.name)//对象通过地址调用
function fun(){
 var c="qqq"
 return c
}
document.writeln(fun())//函数通过语句调用

特殊基本变量 参数管理器
别名叫做可变参数或者参数数组,用来获取函数里的形参
特点:
1.只能定义在函数体里,并且只能内部使用
2.可变参数是通过数组形式存储变量的
3.可变参数不可以用数组下的方法,不能用栈和队列的方法

  function fun(){
document.writeln(arguments.length)//获得数组长度
for(i=0;i<arguments.length;i++){//遍历可变参数
    document.writeln(arguments[i])
}
  }
  fun(1,2,3,4)//参数不限制

闭包(特殊的作用域)
闭包的表现形式是函数嵌套函数,是用来有权访问另一个函数作用域中变量的函数

function Emp(name,age){
  this.name=name;
  this.age=age;
  this.say=function(){//被嵌套的}
}
var a=11;
function fun1(){
  var b=22;
  function fun2(){//被嵌套的}
}

var p=new Emp();
p.say();//执行
var a=11;
function fun1(){
  var b=22;
  function fun2(){//被嵌套的}
  fun2();//执行
}

外部访问闭包 匿名函数的写法
执行方法一:

var a=fun(5)
var b=a(6)
执行方法二:

var v=fun(4)(6)
闭包的优缺点
优点:
1.可以通过闭包来访问全局和局部变量
2.可以通过闭包来实现私有变量
3.闭包的变量不会被垃圾回收机制回收
4.闭包变量会优先在内存中生成
缺点
1.闭包里的变量会一直保持在内存中,造成内存消耗过大
2.闭包可以调用到父类函数里的值,也可以随意更改,所以不安全
闭包和变量
例如1:

   function fun(){
 var x=[]
     for(i=0;i<=10;i++){
   x[i]=function(){
       return i;
     }
   }
    return x;
 }
  var z=fun();
  for(i=0;i<z.length;i++){
    document.writeln(z[i]())
 }

例如2:

for(i=1;i<=5;i++){
  setTimeout(function(){
    document.writeln(i)
  },1000)
}

解决方法:

  function fun(){
  var x=[]
  for(i=0;i<10;i++){
    x[i]=function(num){
      return function(){
        return num
      }
    }(i)
  }
  return x
}
var z=fun()
for(v in z){
      document.writeln(z[v]())
}
fun()

垃圾收集
js 具有自动垃圾回收机制,例如c c++就需要程序员手动回收垃圾。
实现原理:找出那些不再继续使用的变量,然后是否内存,js会按照一定的时间间隔,周期的执行这一操作。
变量回收的特点:
对于局部变量的回收,js会在一定周期里进行检测,因为局部变量只在函数执行过程中存在,所以在函数运行过程中,局部变量在栈或堆内存里分配空间,存储值,直到函数结束,js会自动释放他们的内存。
全局变量的定义会在浏览器关闭时,或者js检查代码发现此变量不再继续使用时才会回收。
在闭包里定义的变量,会一直保存在内存中,不会被垃圾回收机制进行自动回收。
垃圾回收机制方式
1.标记清除
当一个变量进入了环境,我们可以通过一个字段表示“进入环境”,当是进入环境时,表示内存正在占用并执行,如果当函数执行完毕时,我们可以把字段修改成”离开环境“,所以js检测到所有为“离开环境”的状态时,就进行垃圾回收
在五大主流浏览器之后的版本,在2008年之后,都是这样做的,只是时间间隔不一样。
2.引用计数
js定义了一个数字变量来跟踪值被引用的次数,当声明并赋值给一个变量时,js 就对这个次数加1,如果这个变量参与其他运算,或赋值给了新变量,在次数会累加;当这个变量被另一个值取代,则次数会减1,直到次数减到0时,js才会对其回收
在五大主流浏览器的低版本应用的
自己手动回收

var a=11;a=null;
var emp={}; emp=null;
function(){return null};
var fun=function(){}; var fun=null;
内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值