一、js作用域:
由于js没有像
java,c,c++等一样的用{}来定义一个变量的作用域,当然也不是说js就没有作用域的概念。
我们看下面一段代码:
function f0(){
var a = 0;
b = 1;
}
function f1(){
for(var i=0;i<5;i++){}
alert(i);
}
f0();
alert(a); //a is not defined
alert(b); //1
f1();//5
可见,js中还是有作用域的,也就是全局变量和局部变量,只不过局部变量的访问是function内,而不是{}内。注:我们在函数内定义变量时用 var 则是局部变量,如果不用var 则是定义为全局变量,所以alert(b)时也就有值了。另,如果在函数内部定义的 var k,那么内部将不再使用全局变量k,如果如果在函数内部中在定义之前就使用了k的话是会报错的,同时可以使用window.k调用全局变量k。
二
、闭包
由于定义了局部变量a,这样我们起到保护函数内的局部变量的作用
。但是有时候我们要在函数外部调用或者改变局部变量值时,则就需要用到闭包,请看下面一段代码。
function f0(){
var a = 0;
b = 1;
function f1(){
alert(++a)
}
return f1;
}
var c = f0();
c();//1
c();//2
var d=f0();
d();//1
在我们在执行var c = f0()就产生了一个闭包,也就是当在函数外部调用内部变量时(定义的时候是没有的),就会产生闭包
,这样函数内部定义的变量就不会在随着函数的结束而消失,而是一直存在了缓冲当中(由于js的缓存机制是在当没有调用时回收),所以,闭包要慎用,处理不当会造出浏览器内存溢出。
关于作用域和闭包我们来看一个经典的例子:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
alert(this.name);//My Object
return function(){
alert(this.name);//The Window
};
}
};
object.getNameFunc()();
上面的例子中object.getNameFunc()()等价于:
var f2=object.getNameFunc();//弹出My Object 在此getNameFunc为object的局
//部函数
f2();//弹出 The Window 在此f2为全局函数
。
由于在外部调用了内部变量getNameFunc,而getNameFunc的存在依赖于object的存在,所以object将会一直存在。
三、匿名函数:
所谓匿名函数就是没有名字的函数,一般匿名函数的调用有如下几种方式:
1、(function(){})();
2、(function(){}());
3、在定义触发的时候使用;
1/3是最常用的方式,之前我有一个误区,以为使用了匿名函数就不会产生闭包,这样js的GC就回将垃圾回收回去。GC是否回收回去,取决于函数外部是否调用了函数内部的参数。使用匿名函数的好处就是将局部变量封装,不那么依赖外部变量,当然,缺点也是那么的明显,由于是局部变量,没发引用,在firebug的dom中也看不到,如果使用了大量全局变量,那将是非常痛苦的事,不过在变成过程中还是推荐使用匿名函数。
个人愚见,欢迎指正。
分享到:
相关推荐
js闭包的个人理解
JS闭包理解 什么是闭包? 当有一个函数想要访问另一个函数内部的变量,这个是访问不了的。所有我们要用闭包来访问。所以简单的来说,闭包就是连接函数内部和外部的一座桥梁,通过闭包我们能够访问其他函数内部的...
深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系
网上大多只是讲解js闭包的大概意思和小例子,但真实用于项目中又该怎么用呢。这个例子真实的告诉大家在项目中的用法
javascript深入理解js闭包.docx
JavaScript闭包深入理解.pdf
js 闭包的理解与注意事项
js闭包 • 每个函数都有一个包含词法环境的执行上下文,它的词法环境确定了函数内的变量赋值以及对外部环境的引用。看上去函数“记住”了外部环境,但其实上是这个函数有个指向外部环境的引用。这就是“闭包”的...
本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。
NULL 博文链接:https://onestopweb.iteye.com/blog/2360023
Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态...本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来使读者可以更深入的理解闭包。
闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...
js闭包和垃圾回收机制示例详解 目录 前言 正文 1.闭包 1.1闭包是什么? 1.2闭包的特性 1.3理解闭包 1.4闭包的主要实现形式 1.5闭包的优缺点 1.6闭包的使用 2.垃圾回收机制 总结 前言 正文 ...
JavaScript闭包的定义和理解,含代码示例
理解 JavaScript 闭包 要成为高级 JavaScript 程序员,就必须理解闭包
javaScript无可争议的是如今前台开发最常用的技术,该文档讲解了javaScript中闭包技术,在jquery中大量的使用了该技术,学好可以更好的理解学习jquery。
本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAscript语言规范来使读者可以更深入的理解闭包。闭包是Closure, 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
前端与移动开发:js对闭包的深入理解.docx
• 简介 • 基于对象的属性名解析 o 值的指定 o 值的读取 • 标识符解析、执行环境和作用域链 o 执行环境 o 作用域链与 [[scope]] o 标识符解析 • 闭包