【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 ...
随机推荐
- P1850 换教室 概率dp
其实说是概率dp,本质上和dp没什么区别,就是把所有可能转移的情况全枚举一下就行了,不过dp方程确实有点长... ps:这个题的floyed我竟然之前写跪了... 题目: 题目描述 对于刚上大学的牛牛 ...
- Firefox浏览器中,input输入框输入的内容在刷新网页后为何还在?
转自:http://www.webym.net/jiaocheng/473.html 这个问题比较容易解决,如果不希望浏览器保留以前输入的内容,只要给对应的 input 输入框加上以下参数: auto ...
- 如何让 vue 在 sublime 中变成彩色的
在 sublime 中编辑 vue 时,导入后是纯白色的文本,如下图: 想让其变成彩色的文本,需要安装插件,步骤如下: 1. 按住:Ctrl + Alt + P 2. 输入:install Packa ...
- ASP之ViewState和IsPostBack
没怎么写过ASPX页面,今天在做增删改的界面的时候,修改出了问题. 根据传过来的ObjectID加载页面数据,赋值给TextBox控件后,修改控件的值回写数据库,发现值没有变化. 简单的例子如下: 然 ...
- Visual Studio q启动卡顿
在开发人员CMD下面执行 Devenv.exe /ResetSettings ,然后顺利打开 总发现vs2015经常把cpu给占满了,导致电脑卡的不要不要的.这是CodeLens引起的,因为装了VAs ...
- Cracking the Coding Interview 4.8
You are given a binary tree in which each node contains a value. Design an algorithm to print all pa ...
- java.util.Date
package com.etc.usual; import java.util.Calendar; import java.util.Date; /** * * @author Administrat ...
- mvc3结合spring.net-依赖注入
namespace Tuzi.Models.IService { public interface IPersonService { string say(string words); } names ...
- Android 侦听应用(Package)变化的方法侦听广播
应用的状态变化,包括安装.卸载.更新,是android系统上重要的事件.如何侦听到?有两种方法,一是通过侦听广播,一是实现PackageMonitor. 侦听广播 当Package状态发生变化时, ...
- SSIS SQL Server配置自动作业
目录: 一. 用SSMS配置作业,自助调度: 二.用SSMS调SSIS包: 一. 用SSMS配置作业,自助调度: 为验证数据,先创建一个表: CREATE TABLE test_table (id I ...