zoukankan      html  css  js  c++  java
  • 【JS】垃圾回收和块级作用域

    垃圾回收:

    JavaScript中,开发者不必关心内存分配和回收的问题。这和Java语言相似。有一个垃圾自己主动回收机制。那么JavaScript内部到底是如何回收垃圾的呢?

    使用标记回收法:就是说。离开作用域的值将被自己主动标记为能够回收。因此将在垃圾收集期间被删除。

    标记删除是当前主流的垃圾收集算法,这样的算法的思想是给当前不使用的值加上标记,然后回收期内存。

    关于作用域的知识,大家有须要能够再搜集一下资料学习,这里就不具体叙述了。

    打个例如:

    function test(){
    			var color='red';
    			alert(color);
    		}
    		test();
    当test()运行完成。color也离开了作用域,此时会被自己主动加入一个“能够回收”的标记,当有“垃圾车”经过的时候(会有一个固定的时间来“巡视”,比方每隔2秒“巡视”一次),看到有这个标记就会自己主动回收,开发者就能够爽歪歪不用再对内存分配和回收担忧那么多啦~


    块级作用域:

    JavaScript里没有块级作用域的概念,这和C、Java等高级语言不同。所以在使用if、for时要格外小心。

    function test(){
    			for(var i=1;i<=5;i++){
    				alert(i);	//依次弹出数字1-5
    			}
    			alert(i);		//6
    		}
    		test();

    正由于js没有块级作用域的概念。所以在for循环后面的alert仍然能弹出6,而不是undefined或者报错(正常情况下,i的作用域仅仅在for循环里,离开for循环再使用i就相当于未声明变量。会提示undefined或报错)。

    那么在js中怎样模拟Java等语言。使得拥有块级作用域呢?添加括号()

    function test(){
    			(function (){	//加入一个匿名函数。并使用括号括起来
    				for(var i=1;i<=5;i++){
    					alert(i);	//依次弹出数字1-5
    				}
    			})();		//这一行最末尾的括号()是为了让函数自己主动运行
    			alert(i);	//undefined
    		}
    		test();
    通过加入括号。就能使得其拥有块级作用域了,此时for循环后的alert会提示undefined。

    这样的方法是使用()括起函数,作为一个域,再在外面结尾处加入()表示自己主动运行。而不须要一些触发或者其它事件驱动才运行的函数,大量用于jQuery等底层框架的源代码。

    (function test(){
    			alert('我直接就运行了');
    		})();
    		//注意,这里不须要像传统的方法那样,须要click或者test()才会触发上面test函数的运行,而是自己主动就运行了


    Author:致知

    Sign:路漫漫其修远兮,吾将上下而求索。

  • 相关阅读:
    禅道技术官网
    mysql中获取一天、一周、一月时间数据的各种sql语句写法
    使用HttpFileServer自建下载服务器
    axure新手入门教程
    Mysql存储过程查询结果赋值到变量的方法
    mysql 数据表中查找、删除重复记录
    oracle中的sql%rowcount,sql%found、sql%notfound、sql%rowcount和sql%isopen
    存储过程中的when others then 和 raise
    Oracle的DBMS_OUTPUT.PUT_LINE用法及脚本批处理方法
    oracle 特殊符号
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7115801.html
Copyright © 2011-2022 走看看