【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:路漫漫其修远兮,吾将上下而求索。
【JS】垃圾回收和块级作用域的更多相关文章
- JavaScript的作用;JS常见的三种对话框;==和===的区别;函数内部参数数组arguments在函数内部打印实参;JS的误区:没有块级作用域
JS:客户端(浏览器)脚本语言 弱类型 基于原型 事件驱动 不需要编译(直接运行) JS的作用:表单验证,减轻服务端的压力 添加页面动画效果 动态更改页面内容 Ajax网络请求 (一)常见的对 ...
- 你不知道的JS之作用域和闭包(三)函数 vs. 块级作用域
原文:你不知道的js系列 在第(二)节中提到的,标识符在作用域中声明,这些作用域就像是一个容器,一个嵌套一个,这个嵌套关系是在代码编写时定义的. 那么到底是什么产生了一个新的作用域,只有函数能做到 ...
- 6个函数的output看JS的块级作用域
1. var output = 0; (function() { output++; }()); console.log(output); 函数对全局的output进行操作,因为JS没有块级作用域,所 ...
- 可怜的js居然没有块级作用域
js中在一个函数中定义一个for循环:for(var i=0;i<5;i++) 其中的i并不会随着for循环的结束就销毁,i会一直存在该函数中,这就是js和其他语言的区别,也就是js没有块级作用 ...
- 一个经典的js中关于块级作用域和声明提升的问题
function functions(flag) { if (flag) { function getValue() { return 'a'; } } else { function getValu ...
- JS的块级作用域
今天带来的是 "对<你不知道的js>中块级作用域的总结" 分享: 1)用with从对象中创建出来的作用域只在with声明中而非外部作用域有效,同时可以访问已有对象的属性 ...
- JS 模仿块级作用域
function outputNumbers(count) { for (var i=0; i<count; i++) { console.log(i); } var i; // 重新声明变量 ...
- js中的块级作用域
概述 函数是js中最常见的作用域单元, 声明在一个函数内部的变量或函数会在所处的作用域中隐藏起来, 这是有意为之的非常好的设计原则. 但是随着js的发展, 我们有了某个代码块(通常指{..}内部)隐藏 ...
- js私有作用域(function(){})(); 模仿块级作用域
摘自:http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.phpvar.com%2Farchives%2F3033.html js没有块级作用域,简单的例子: f ...
随机推荐
- Coursera Algorithms week1 查并集 练习测验:1 Social network connectivity
题目原文描述: Given a social network containing. n members and a log file containing m timestamps at which ...
- 常用的 Maven 命令
maven 命令的格式为 mvn [plugin-name]:[goal-name],可以接受的参数如下. -D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试: -P 指定 ...
- Asp.net三种事务处理
事务处理是在数据处理时经常遇到的问题,经常用到的方法有以下三种总结整理如下:方法1:直接写入到sql 中在存储过程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRA ...
- 消除svn选定(checkout)桌面上文件显示一大堆问号。
图片: 解决方法一: 桌面右键选择TortoiseSVN——>点击Settings,如下图,选中Icon Overlays(图标覆盖),去勾选Fixed drives(本地磁盘),点击确定,按F ...
- PL/SQL之高级篇
原文地址:http://www.cnblogs.com/sin90lzc/archive/2012/08/30/2661117.html 参考文献:<Oracle完全学习手册> 1.概述 ...
- 三维重建:SLAM的粒度和工程化问题
百度百科的定义.此文引用了其他博客的一些图像,如有侵权,邮件联系删除. 申明一下,SLAM不是一个算法,而是一个工程. 在计算机视觉中, 三维重建是指根据单视图或者多视图的图像重建三维信息的过程. 由 ...
- 使用 C# 进行 HTTP 操作
说明 主要使用到了 Newtonsoft.Json 和 System.Net 两个命名空间. Program.cs static void Main(string[] args) { WebOpert ...
- AS3.0+PHP写入mySQL
php中$_POST变量是一个数组,用于收集来自method="post"的值,内容是有HTTP POST方法发送的变量名称和值. 从带有POST方法的表单发送的信息,对任何人都是 ...
- yar 调用rpc方法
<?php class RpcController extends Yaf_Controller_Abstract { //RPC入口 public function indexAction($ ...
- SpringBoot入门系列(转)
SpringBoot入门系列:第一篇 Hello World http://blog.csdn.net/lxhjh/article/details/51711148