JavaScript中的闭包介绍

 这篇文章主要介绍了JavaScript中的闭包介绍,本文讲解了Javacript 闭包、Javscript 闭包与this、Javscript 闭包与读写变量等内容,需要的朋友可以参考下

 
 

所谓的闭包应该是指: 内部函数读取当前函数以外的变量,即创建时所处的上下文环境。

代码如下:

function hello(){
var char = "hello,world";
function print(){
console.log(char);
};
return print();
}

需要注意的是这里的print函数引用了外部hello函数的char变量,于是在这里我们能够返回一个
代码如下:

hello,world

而这个功能在某种意义上来说,应该是要归功于作用域。当然了,我们没有办法直接访问char,除非是我们声明这个变量的时候出错了。如
代码如下:

function hello(){
char = "hello,world";
function print(){
console.log(char);
};
return print();
}

仅仅是因为少了个var。

 

 

代码如下:

在这里hello变成一个闭包 了。 闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。

 

Javscript 闭包与this

需要注意的是读取this与arguments时,可能是会出问题的。

代码如下:

function hello(){
this.char = "hello,world";
function output(){
char = "I'm no hello world";
console.log(this.char);
};
return output();
}

当然了这个例子并不够贴切,so,我们需要一个额外的例子来解释这个问题,下面引用一个《Javascript高级程序设计》中的一个例子,来说明这个问题。
代码如下:

var name = "The window";

 

var object = {
name: "My Object",

getNameFunc: function(){
return function(){
return this.name;
}
}
};
object.getNameFunc()()

只是这种用法实在是,而解决方法便是保存一个临时变量that,如之前在《关于Javascript的this的一些知识》一文中所说的。

 

 

代码如下:

var name = "The window";
var object = {
name: "My Object",

 

getNameFunc: function(){
var that = this;
return function(){
return that.name;
}
}
};
object.getNameFunc()()

Javscript 闭包与读写变量
值得注意的是,如果我们没有处理好我们的变量时,我们也可以修改这些变量。
代码如下:

function hello(){
var char = "hello,world";
return{
set: function(string){
return char = string;
},
print: function(){
console.log(char)
}
}
}
var say = hello();
say.set('new hello,world')
say.print() // new hello world

Javascript 闭包与性能

 

引用MDC的说法

代码如下:

如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。

文上还说到。
代码如下:

例如,在创建新的对象或者类时,方法通常应该关联于对象的原型,而不是定义到对象的构造器中。原因是这将导致每次构造器被调用,方法都会被重新赋值一次(也就是说,为每一个对象的创建)。

时间: 2024-11-01 17:29:54

JavaScript中的闭包介绍的相关文章

JavaScript中的闭包介绍_javascript技巧

所谓的闭包应该是指: 内部函数读取当前函数以外的变量,即创建时所处的上下文环境. 复制代码 代码如下: function hello(){     var char = "hello,world";     function print(){         console.log(char);     };     return print(); } 需要注意的是这里的print函数引用了外部hello函数的char变量,于是在这里我们能够返回一个 复制代码 代码如下: hello,

JavaScript中消除闭包的一般方法介绍

 这篇文章主要介绍了JavaScript中消除闭包的一般方法介绍,本文直接给出了操作示例,需要的朋友可以参考下     JavaScript 的闭包是一个其主动发展的特性, 也是一个被动发展的特性. 也就是说, 一方面, JS 有了闭包能更好解决一些问题. 另一方面, JS 为了解决某些问题, 而不得不使用闭包勉强来解决问题. 前者这里不讨论, 如果 JS 闭包能更好的解决问题, 当然使用闭包更好. 我讨论的是后者, 是因为 JS 本身的限制, 而不得不磕磕绊绊地用闭包来解决的问题, 例如"变量

JavaScript中的闭包(Closure)详细介绍_javascript技巧

闭包是JavaScript中一个重要的特性,其最大的作用在于保存函数运行过程中的信息.在JavaScript中,闭包的诸多特性源自函数调用过程中的作用域链上.   函数调用对象与变量的作用域链   对于JavaScript中的每一次函数调用,JavaScript都会创建一个局部对象以储存在该函数中定义的局部变量:如果在该函数内部还有一个嵌套定义的函数(nested function),那么JavaScript会在已经定义的局部对象之上再定义一个嵌套局部对象.对于一个函数,其内部有多少层的嵌套函数

JavaScript中的闭包_javascript技巧

1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 简单的说,Javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内.而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数和声明的其他内部函数.当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包. 闭包的特点 1 函数嵌套函数 2 函数内部可以引用外部的参数和变量 3 参数和变量不会被垃

JavaScript中逗号运算符介绍及使用示例

 这篇文章主要介绍了JavaScript中逗号运算符介绍及使用示例,本文讲解了逗号运算符的定义.使用例子及实际使用的一些技巧,需要的朋友可以参考下     有一道js面试题,题目是这样的:下列代码的执行结果是什么,为什么? 代码如下: var i, j, k; for (i=0, j=0; i<10, j<6; i++, j++) { k = i+j; } document.write(k);   答案是显示10,这道题主要考察JavaScript的逗号运算符. 下面是MDN对逗号运算符的定义

浅析 JavaScript 中的 “闭包”

#JavaScript closure(闭包) 闭包的概念 Wikipedia:In programming languages, closures (also lexical closures or function closures) are a technique for implementing lexically scoped name binding in languages with first-class functions. 译文:"在编程语言中,闭包(也词法闭包或函数闭包)是

Python中的闭包介绍及实例

Python中的闭包介绍 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外.所以,闭包是由函数和与其相关的引用环境组合而成的实体. 在开始介绍闭包之前先看看Python中的namespace. Python中的namespace Python中通过提供 namespace 来实现重名函数/方法.变量等信息的识别,其一共有三种 namespace,分别为:     loca

JavaScript中的闭包原理分析_javascript技巧

我们来看一个定义: Closure 所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 这说明了,JavaScript中的闭包是包含了上下文的函数,也就是说,这个函数的作用基础,是它所处的环境,这是不能超越的,跟线性代数是不是有一点似曾相识的感觉呢? 换个角度看,闭包的作用是为了实现OO.JavaScript中,没有像C++那样的public.private.protect属性标识, 建立起类比较困难."类

javascript中函数用法介绍(匿名函数,函数传值,参数)(1/2)

第一课 -- 匿名函数 一.什么是匿名函数? 在Javascript定义一个函数一般有如下三种方式: 1.函数关键字(function)语句:  代码如下 复制代码 function fnMethodName(x){alert(x);} 2.函数字面量(Function Literals): var fnMethodName = function(x){alert(x);} 3.Function()构造函数: var fnMethodName = new Function('x','alert(