深入解析Javascript闭包及实现方法

一、什么是闭包和闭包的几种写法和用法

1、什么是闭包

闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭包的特点:
1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
简单的说,Javascript允许使用内部函数—即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。

2、闭包的几种写法和用法

首先要明白,在JS中一切都是对象,函数是对象的一种。下面先来看一下闭包的5种写法,简单理解一下什么是闭包。后面会具体解释。

//第1种写法
function Circle(r) {
      this.r = r;
}
Circle.PI = 3.14159;
Circle.prototype.area = function() {
  return Circle.PI * this.r * this.r;
}  

var c = new Circle(1.0);
alert(c.area());

这种写法没什么特别的,只是给函数添加一些属性。

//第2种写法
var Circle = function() {
   var obj = new Object();
   obj.PI = 3.14159;  

   obj.area = function( r ) {
       return this.PI * r * r;
   }
   return obj;
}           //在此我向大家推荐一个前端全栈开发交流圈:619586920 突破技术瓶颈,提升思维能力

var c = new Circle();
alert( c.area( 1.0 ) );

这种写法是声明一个变量,将一个函数当作值赋给变量。

//第3种写法
var Circle = new Object();
Circle.PI = 3.14159;
Circle.Area = function( r ) {
       return this.PI * r * r;
}  

alert( Circle.Area( 1.0 ) );

这种方法最好理解,就是new 一个对象,然后给对象添加属性和方法。

//第4种写法
var Circle={
   "PI":3.14159,
 "area":function(r){
          return this.PI * r * r;
        }                //在此我向大家推荐一个前端全栈开发交流圈:619586920 突破技术瓶颈,提升思维能力
};
alert( Circle.area(1.0) );

这种方法使用较多,也最为方便。var obj = {}就是声明一个空的对象。

//第5种写法
var Circle = new Function("this.PI = 3.14159;this.area = function( r ) {return r*r*this.PI;}");  

alert( (new Circle()).area(1.0) );

说实话,这种写法我是没用过,大家可以参考一下。

总的来说,上面几种方法,第2中和第4中较为常见,大家可以根据习惯选择。

上面代码中出现了JS中常用的Prototype,那么Prototype有什么用呢?下面我们来看一下:

var dom = function(){

    };

    dom.Show = function(){
        alert("Show Message");
    };

    dom.prototype.Display = function(){
        alert("Property Message");
    };

    dom.Display(); //error
    dom.Show();
    var d = new dom();
    d.Display();
    d.Show(); //error

我们首先声明一个变量,将一个函数赋给他,因为在Javascript中每个函数都有一个Portotype属性,而对象没有。添加两个方法,分别直接添加和添加打破Prototype上面,来看下调用情况。分析结果如下:

1、不使用prototype属性定义的对象方法,是静态方法,只能直接用类名进行调用!另外,此静态方法中无法使用this变量来调用对象其他的属性!
2、使用prototype属性定义的对象方法,是非静态方法,只有在实例化后才能使用!其方法内部可以this来引用对象自身中的其他属性!

本次给大家推荐一个免费的学习圈,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。**获取资料

原文地址:https://blog.51cto.com/14145734/2395182

时间: 2025-02-01 22:51:31

深入解析Javascript闭包及实现方法的相关文章

深入解析Javascript闭包

首先给个例子: function PfnOuter(){ var num=999; function PfnInner(){ alert(num); } return PfnInner; } var test=PfnOuter(); test(); //999 上述实例中PfnInner函数就是闭包,闭包简单的理解就是能够读取其它函数内部变量的函数.由于Javascript中只有函数内部的子函数才能读取函数内部的变量,因此闭包也可以简单的理解成定义在一个函数内部的函数,闭包就是将函数内部和函数外

消除JavaScript闭包的一般方法

JavaScript 的闭包是一个其主动发展的特性, 也是一个被动发展的特性. 也就是说, 一方面, JS 有了闭包能更好解决一些问题. 另一方面, JS 为了解决某些问题, 而不得不使用闭包勉强来解决问题. 前者这里不讨论, 如果 JS 闭包能更好的解决问题, 当然使用闭包更好. 我讨论的是后者, 是因为 JS 本身的限制, 而不得不磕磕绊绊地用闭包来解决的问题, 例如"变量只初始化一次"这样的需求. 常规的语言这样解决: class Class{ function init(){

Javascript闭包深入解析及实现方法

1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点:1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态.2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区.简单的说,Javascript允许使用内部函数—即函数定义和函数表达式位于另一个函数的函数体内.而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数和声明的其他内部函数.当其中一个这样的内部函数在包含它们

Javascript调用C#后台方法及JSon解析

Javascript调用C#后台方法及JSon解析 如何使用Ajax 调用C# 后台方法. 本文目录 如何使用Ajax 调用C# 后台方法. 1.后台(.cs)测试方法 2.前台调用(javascript)代码: 在通常的WebForm中,我们通常使用“一般处理程序”来响应Ajax请求.今天我们尝试使用Ajax调用.cs文件的方法. 1.后台(.cs)测试方法 [WebMethod] public static string DisplayImagesInfo() { List<ImageQue

Javascript创建对象几种方法解析

Javascript创建对象几种方法解析 Javascript面向对象编程一直是面试中的重点,将自己的理解整理如下,主要参考<Javascript高级程序设计 第三版>,欢迎批评指正. 通过字面量形式,创建对象: var person_1 = { name: "userName", age: 20 } 工厂模式创建对象 通过一个构造函数接收参数的方式构造对象,可无数次调用这个函数,通过改变参数构造不同的对象 function createPerson(name,age){

JavaScript ---- 闭包(什么是闭包,为什么使用闭包,闭包的作用)

经常被问到什么是闭包? 说实话闭包这个概念很难解释.JavaScript权威指南里有这么一段话:"JavaScript函数是将要执行的代码以及执行这些代码作用域构成的一个综合体.在计算机学术语里,这种代码和作用域额综合体叫做闭包.".言外之意所有的JavaScript函数都是闭包. 有人会说,这个解释不对.我们经常说的闭包应该像下面的一串代码: var f1 = function(){ var a=1; return function f2(){ a++; alert(a) } } v

详解JavaScript闭包

要想完全明白JavaScript的闭包,要先明白js中的一些基础原理,然后我再给出一些例子来讲解闭包. 在执行JavaScript时会创建一个执行环境(excution context),执行环境定义了变量或函数可以访问的其他数据.每个执行环境都有一个与之关联的变量对象(variable object 有些地方叫域对象(Scope object)),在执行环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象,但解析器在处理数据时会在后台使用它. 全局执行环境是最外层的

Javascript闭包!

# javascript闭包(Closure) > 所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 上面是官方的解释,但这解释只会让人头晕.要理解闭包,首先理解两点:变量的作用域以及作用域链,这两个在前面都已经介绍过了,并且举了简单了列子,来回顾一下: var color = "blue";       function changeColor(){              var anotherColo

JavaScript教程之JavaScript 闭包

JavaScript 变量可以是局部变量或全局变量. 私有变量可以用到闭包. 全局变量 函数可以访问由函数内部定义的变量,如: 实例 function myFunction() {    var a = 4;    return a * a;} 尝试一下 ? 函数也可以访问函数外部定义的变量,如: 实例 var a = 4;function myFunction() {    return a * a;} 尝试一下 ? 后面一个实例中, a 是一个 全局 变量. 在web页面中全局变量属于 wi