js关于闭包的内存的问题--deep down

js有一个东西叫做GC(garbage collection )垃圾回收机制;js中有两种类型:js基本数据类型,js引用类型;

当一个函数[对象]--引用类型被引用后,过后,出了它的功能之后,gc会将其马上回收,以免占用.仅且仅有引用类型会

产生闭包.如果一个函数的应用结束了,心里想:我总算可以离开内存(公司)了,就走了,但是有的时候啊,别的函数会引用到他内部

的变量,就如同公司需要他的脑力,但是不需要容貌,没办法,他还是只能够留下来在内存中(公司),所以没有回收,所以驻留!如下面的实例和解释:

function a()
{
  var a = 1;
  return function(){
    console.log(a++);
  }
}
var b = a();
b();
时间: 2024-10-06 12:31:59

js关于闭包的内存的问题--deep down的相关文章

转《js闭包与内存泄漏》

首先,能导致内存泄漏的一定是引用类型的变量,比如函数和其他自定义对象.而值类型的变量是不存在内存泄漏的,比如字符串.数字.布尔值等.因为值类型是靠复制来传递的,而引用类型是靠类似c语言中的指针来传递的.可以认为一个引用类型的变量就是一个指向某个具体的内存地址的指针. 当我们用js代码创建一个引用类型的时候(以下简称对象),js引擎会在内存中开辟一块空间来存放数据,并把指针引用交给那个变量.内存是有限的,js引擎必须保证当开辟的对象没用的时候,把所分配的内存空间释放出来,这个过程叫做垃圾回收,负责

JS之闭包

闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性: 1)作用域链 2)垃圾(内存)回收机制 3)函数嵌套...等等. 首先理解一下作用域链的含义,简单来说,作用域链就是函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引. 而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至全局对象为止. 当函数中需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量中先找,如果没有

JS基础——闭包

有关JS中闭包的理解和使用. 一.简介 子函数可以使用父函数中的局部变量,这种行为就叫做闭包.通常指,有权访问另一个函数作用域中的变量的函数.创建时,通常在一个函数中创建另一个函数,通过另一个函数访问这个函数的局部变量. function box() { var user = 'Lee'; return function () { //通过匿名函数返回 box()局部变量 return user; }; } alert(box()()); 这里通过一个匿名函数来访问父函数中的user变量,并且返

js:深入闭包(作用域)

/** * 闭包的作用域 */ fn1(); //fn1 能够执行,不会报错,对于通过function func_name()这种写法来定义的函数,永远都会被最先初始化. function fn1(){ console.log("fn1"); } fn2(); //报错:fn2 is not a function /** *使用如下方式定义函数,不会被先执行,如果在定义之前调用,报错. *这种函数的定义方式是先在内存中创建一块区域,之后通过一个fn2的变量指向这块区域, *这块区域的函

js中闭包for循环

var a=[]; for(var i=0;i<10;i++){ a[i]=function(){ alert(i); } } alert(i); //10 a[0](); //10 a[9](); //10 为什么a[0]到a[9]都是10,而不是我们想像中的0到9呢? 我的理解是js的作用域导致的. 首先来看参数的传递.js是按值传递的,源代码中的a[i]=function(){alert(i)},a[i]保存的是一个指向堆内存的地址(对象和方法在js中保存在堆内存中).当每一次for循环时

关于js中闭包的理解

1.以前很不理解js中闭包的概念及使用,下面来看一下 function foo() { var a = 123; var b = 456; return function () { return a; } } var fn = foo(); 上面的代码只能访问 a和b,但是不能修改,这是js中闭包的技术之一 function foo() { var a = 123; var b = 456; return { get_a: function () { return a; }, set_a: fu

JS高级——闭包

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script type="text/javascrip

js:深入闭包(作用域:下)

函数功能:该函数将一个字符串转为字形下标的数组.此函数可用来确定一种字体里是否存在某个字形 控制台下代码: #include "stdafx.h" #include <windows.h> #include"stdio.h" void main() { char ch[] = {'0'}; WORD chnl[20] = {0}; HDC hdc; hdc = GetWindowDC(0); int n = GetGlyphIndicesA(hdc,ch

[Js]JavaScript闭包和范围的快速测试

1. if (!("a" in window)) { var a = 1; } alert(a); [分析]代码含义:如果window不包含属性a,就声明一个变量a并赋值为1 ①Js引擎会先扫描所有的变量声明 ②所有的全局变量都是window的属性 ③变量声明和赋值一起用时,Js引擎会自动将它分成两部分:变量声明提前,变量赋值没有(不将赋值提前是因为他有可能影响代码执行出不可预期的结果) 所以代码执行顺序等价于 var a; if(!("a" in window))