一、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中也看不到,如果使用了大量全局变量,那将是非常痛苦的事,不过在变成过程中还是推荐使用匿名函数。
个人愚见,欢迎指正。
分享到:
相关推荐
### JavaScript闭包的理解 在JavaScript中,闭包(Closure)是一种非常重要的概念,它涉及到函数作用域、变量生命周期以及函数内部对外部作用域的访问等多个方面。本文将基于提供的文件内容,深入探讨JavaScript...
闭包是JavaScript中实现数据隐藏和封装的一种重要手段,对于理解和编写高效的JS代码至关重要。 1. **作用域的理解** - **全局变量**:在整个程序中都可访问的变量,它们在整个脚本的生命周期内都存在。 - **局部...
在这个“js闭包理解之倒计时”的主题中,我们将深入探讨如何利用闭包实现一个实际项目中的倒计时功能。 首先,让我们了解一下闭包的基本概念。在JavaScript中,每当函数被创建时,它都会形成一个闭包,这个闭包包含...
总之,JavaScript闭包是理解和编写高效、模块化代码的关键概念,它能帮助我们更好地管理作用域、变量和内存,从而提高代码的复用性和可维护性。在日常开发中,熟练掌握闭包不仅可以提升编程技能,也能让代码更加优雅...
深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系
标题《JavaScript闭包的理解》涉及的知识点主要围绕JavaScript编程中的一个重要概念——闭包。闭包是一个高级且复杂的话题,它是JavaScript语言的核心特性之一,同时也是一大难点。要想熟练运用JavaScript,掌握闭包...
### JavaScript闭包完整解释 #### 一、闭包的基本概念 **闭包**是一个非常重要的JavaScript概念,它指的是一个函数能够记住并访问其外部作用域中的变量的能力,即使该函数在其外部作用域之外被调用也是如此。具体...
### JavaScript闭包详解 #### 一、闭包概念与特性 **闭包**是JavaScript语言的一个重要特性,它使得函数可以访问并操作其外部作用域内的变量,即使该函数在其外部作用域之外被调用。要理解闭包,首先需要了解...
JavaScript 闭包是一种强大的编程工具,常常被用来解决特定的问题和优化代码结构。在JavaScript中,闭包是指一...通过正确理解和运用闭包,开发者可以编写更高效、更灵活的代码,同时避免全局变量污染和其他潜在问题。
### JavaScript闭包的理解 #### 一、闭包的定义与特点 闭包是JavaScript中一个非常重要的概念,它指的是一个函数能够访问并操作其外部作用域中的变量的能力。这一特性使得JavaScript具有了一些其他语言不具备的...
JavaScript中的闭包是一种重要的编程概念,它涉及到函数、作用域和内存管理等多个方面。闭包的本质是函数能够访问...理解和掌握闭包是提升JavaScript编程能力的重要一步,它能够帮助开发者编写出更高效、更灵活的代码。
js 闭包的理解与注意事项
本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。
以下是一些关于JavaScript闭包的关键知识点: 1. **函数嵌套**:闭包最常见的形式是内部函数引用了外部函数的变量。例如: ```javascript function outerFunction() { var outerVar = 'I am from the outer ...
Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态...本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来使读者可以更深入的理解闭包。
总之,JavaScript的闭包是一种核心概念,理解和掌握闭包对于深入学习JavaScript以及使用jQuery等库进行前端开发至关重要。通过闭包,开发者可以实现更灵活和高效的设计模式,提高代码质量与可维护性。
闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...
在JavaScript中,闭包是一种特殊的函数,它能够访问并操作其定义时的作用域,即使该作用域在其执行时已经不存在。闭包的概念是基于JavaScript的词法作用...理解并掌握闭包对于编写高效、安全的JavaScript代码至关重要。
闭包是JavaScript编程中的一个重要概念,它涉及到函数、作用域、内存管理和变量持久化等多个方面...理解闭包对于编写高效、健壮的JavaScript代码至关重要。通过不断实践和深入学习,开发者可以更好地掌握这一核心概念。