当前位置:首页 » 操作系统 » 前端闭包算法

前端闭包算法

发布时间: 2022-09-11 02:01:46

javaScript 中的闭包好处是什么为什么用到闭包

js中的局部变量出了作用于就会被垃圾回收机制回收,这时候如果想长久保存这个变量不被回收就要用到闭包。

真心想学习JS、以后想朝着这个方向发展,那么你一定要来这个企鹅裙,前面前面是二

九六,中间是五九1,最后面就是二九0,连起来就是完整的噢,来这里可以这里学习经验,得到专人解答,这样你可以成长的更快,期待你的加入!!!闭包的规则是:1,函数嵌套函数。2,内部函数使用了外部函数的变量或者参数。

下面有个二级菜单的小案例就是使用了闭包的特性:

<div><li>0</li><li>1</li><li>2</li></div>

<script>

varlis=document.getElementsByTagName("li");

for(vari=0;i<lis.length;i++){

(function(i){//外部函数

lis[i].onclick=function(){alert(i)}//内部函数使用外部函数的参数

})(i);

}

</script>

这就是闭包的一个应用。

② JavaScript 里的闭包是什么应用场景有哪些

闭包是:指有有访问另一个函数作用域中的变量的函数。

创建闭包的常用方式:在一个函数内部创建一个函数。例子:

functioncreateFunction(name){
returnfunction(obj1,obj2){
varvalue1=obj1[name];
varvalue2=obj2[name];

returnvalue1+","+value2;
}
}

了解创建作用域以及作用域有什么作用的细节,对彻底理解闭包到头重要。当某个函数被调用时,会创建一个执行环境及相应的作用域链。然后,使用arguments和其他参数的值来初始化函数的活动对象


一、闭包

1、createFunction()创建时,它(compare)的作用域包含createFunction()函数的活动对象和全局对象。

//创建函数
varcompare=createFunction("name");
console.log(typeofcompare);//function

2、匿名函数被执行时,创建自己的活动对象和可以访问createFunction()的执行环境。

//调用函数
varresult=compare({name:"jjaiy"},{name:"ascy"});//jjaiyy,ascy

3、createFunction()函数执行完后,其执行环境的作用域不会被销毁。原因在于它的活动对象还在内存中,直到匿名函数被销毁。

//解除对匿名函数的引用(以便释放内存)
compare=null;

原因在于:

浏览器的垃圾收集方式有:

  • 标记清除(主要针对变量)

  • 引用计数(跟踪记录每个值被引用的次数)

二、实例运行

封装功能

varroute={
routes:{},
for:function(path,handler){//闭包
this.routes[path]=handler;//引用回调函数
}
};

//执行二个匿名函数
route.for("/start",function(request,response){
response.writeHead(200,{"Content-Type":"text/plain"});
response.write("Hello");
response.end();
});

route.for("/finish",function(request,response){
response.writeHead(200,{"Content-Type":"text/plain"});
response.write("Goodbye");
response.end();
});

//先判断argument中的path变量是否一致,能否调用其函数中的回调函数。
if(typeofroute.routes["/finish"]==='function'){
route.routes["/finish"](request,response);
}

③ javascript 闭包

1、何谓闭包

JavaScript例子:

function GISMapPanel() {
this.mapPanel = document.getElementById("mapDiv");
this.width;
this.height;

this.showMap = function() {
alert(this.mapPanel); //tip:[object]
this.mapPanel.onmousedown = this.mouseDownEventProcess();
}

this.mouseDownEventProcess = function( ){
var _this = this;
return function() {
alert(this.mapPanel); //tip:undefined,why;
_this.width = 400;
_this.height = 300;
//other codes
}
}
}

闭包简单的解释是,ECMAScript允许inner functions(嵌套函数):函数可以定义在另外一个函数里面。这些内部的函数可以访问outer function(父函数)的local变量,参数,其它内部函数。当内部函数被构造,并可以在函数外被获得(函数当成返回值),这个内部函数在 outer function返回后被执行(在outer函数外执行),那一个闭包形成了。

闭包特征:A、作为一个函数变量的一个引用,当函数返回时,其处于激活状态;B、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

2、 闭包隐喻

function就像房子内的居室(也是房子),可以租给给甲居住,甲就是居室(function)的主人(this),也可以租给乙住,乙就成为居室(function)的主人(this),甲原来的一切则被甲带走,乙用不到任何甲的东西。如果甲是房子(外层function)的主人,并把某居室(内层function)租给乙,乙具有居室内的一切,而乙也可以使用甲的卫生间、客厅(外层函数变量,如_this)。闭包变量就是外层房子内变量,包括居室(function)、卫生间、客厅(外层函数变量)。同JavaScript闭包,居室可以是一局、两局、多局,当然一局一般比较好租,JavaScript闭包一般也是一局。

3、闭包作用

面向对象编程的成功和流行,使不支持面向的对象编程的语言也尽量往这个方向靠,如C语言可以通过struct及function指针,模拟面向对象编程,以期达到面向对象的封装、多态;JavaScript则通过基于对象编制以期达到封装性。如上例所示,把地图(div)相关的事件处理代码、相关属性、相关方法集中到GISMapPanel对象中。但由于事件发生的实体是地图对应的div对象,事件函数调用时房子是由div对象居住的,也就是说this是div元素,因此,会出现alert(this.mapPanel); //tip:undefined,div元素没有属性mapPanel;如果想要访问原GISMapPanel对象中的属性,就要象例子所示,把GISMapPanel对象当作一个客厅来处理,从而可以使用客厅内的东西,而不是别人居室内的东西(也是访问不到的,正如alert(this.mapPanel); //tip:undefined,该this就不是外层居室的this了,本来想直接访问外层居室的this)。通过闭包、基于对象,取代了全局变量、函数方式的JavaScript处理事件、业务逻辑处理手段,增加了模块性、封装性、问题局部化等特性。

④ JavaScript 里的闭包是什么应用场景有哪些

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
下面就是我的学习笔记,对于Javascript初学者应该是很有用的。
一、变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
var n=999;
function f1(){
alert(n);
}
f1(); // 999
另一方面,在函数外部自然无法读取函数内的局部变量。
function f1(){
var n=999;
}
alert(n); // error
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
function f1(){
n=999;
}
f1();
alert(n); // 999
二、如何从外部读取局部变量?
出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。
那就是在函数的内部,再定义一个函数。
function f1(){
var n=999;
function f2(){
alert(n); // 999
}
}
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,
对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会 "一级一级" 地向上寻找所有父对象的变量。
所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
三、闭包的概念
上一节代码中的f2函数,就是闭包。
各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
四、闭包的用途
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
怎么来理解这句话呢?请看下面的代码。
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。
这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,
因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。
其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,
所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
五、使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),
把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
六、思考题
如果你能理解下面两段代码的运行结果,应该就算理解闭包的运行机制了。
代码片段一。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){//alert(this.name);//My Object
return function(){
return this.name;// 空
};
}
};
alert(this.name);// The Window
alert(object.getNameFunc()()); // 空

代码片段二。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()()); // My Object

⑤ JavaScript闭包,什么是闭包,对闭包的理解

提问



该问题可能描述不清,建议你重新提问

javascript的闭包是什么意思 有什么用

我有更好回答



PHP交流者之家

电脑网络认证团队  推荐于 2017-09-06

一、什么是闭包?
“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
相信很少有人能直接看懂这句话,因为他描述的太学术。我想用如何在Javascript中创建一个闭包来告诉你什么是闭包,因为跳过闭包的创建过程直接理解闭包的定义是非常困难的。看下面这段代码:
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
这段代码有两个特点:
1、函数b嵌套在函数a内部;
2、函数a返回函数b。
这样在执行完var c=a()后,变量c实际上是指向了函数b,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
我猜想你一定还是不理解闭包,因为你不知道闭包有什么作用,下面让我们继续探索。

⑥ js中闭包是什么意思,有什么作用,最好举例说明啊。

函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称之为“闭包”。
从技术角度讲,所有的JavaScript函数都是闭包: 它们都是对象,它们都关联到作用域链。
实现计数器
介绍利用闭包实现计数器,请看以下代码:

var counter = (function() {

var count = 0;

return function() {

return count ++;

}

})();

以上代码定义了一个立即执行的函数,count遍历只能在这个匿名函数中可以使用。

⑦ JavaScript 里的闭包是什么应用场景有哪些



闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
下面就是我的学习笔记,对于Javascript初学者应该是很有用的。
一、变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
varn=999;
functionf1(){
alert(n);
}
f1();//999
另一方面,在函数外部自然无法读取函数内的局部变量。
functionf1(){
varn=999;
}
alert(n);//error
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
functionf1(){
n=999;
}
f1();
alert(n);//999
二、如何从外部读取局部变量?
出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。
那就是在函数的内部,再定义一个函数。
functionf1(){
varn=999;
functionf2(){
alert(n);//999
}
}
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,
对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chainscope),子对象会"一级一级"地向上寻找所有父对象的变量。
所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
functionf1(){
varn=999;
functionf2(){
alert(n);
}
returnf2;
}
varresult=f1();
result();//999
三、闭包的概念
上一节代码中的f2函数,就是闭包。
各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
四、闭包的用途
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
怎么来理解这句话呢?请看下面的代码。
functionf1(){
varn=999;
nAdd=function(){n+=1}
functionf2(){
alert(n);
}
returnf2;
}
varresult=f1();
result();//999
nAdd();
result();//1000
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。
这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,
因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbagecollection)回收。
这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。
其次,nAdd的值是一个匿名函数(anonymousfunction),而这个匿名函数本身也是一个闭包,
所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
五、使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(PublicMethod),
把内部变量当作它的私有属性(privatevalue),这时一定要小心,不要随便改变父函数内部变量的值。
六、思考题
如果你能理解下面两段代码的运行结果,应该就算理解闭包的运行机制了。
代码片段一。
varname="TheWindow";
varobject={
name:"MyObject",
getNameFunc:function(){//alert(this.name);//MyObject
returnfunction(){
returnthis.name;//空
};
}
};
alert(this.name);//TheWindow
alert(object.getNameFunc()());//空

代码片段二。
varname="TheWindow";
varobject={
name:"MyObject",
getNameFunc:function(){
varthat=this;
returnfunction(){
returnthat.name;
};
}
};
alert(object.getNameFunc()());//MyObject

一层访问一层,不能跨层访问

⑧ javascript怎么实现闭包

不需要实现,只需要学会使用
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

一、变量的作用域

要理解闭包,首先必须理解Javascript特殊的变量作用域。

变量的作用域无非就是两种:全局变量和局部变量。

Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。

Js代码

var n=999;

function f1(){
alert(n);
}

f1(); // 999

另一方面,在函数外部自然无法读取函数内的局部变量。

Js代码

function f1(){
var n=999;
}

alert(n); // error

这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

Js代码

function f1(){
n=999;
}

f1();

alert(n); // 999

--------------------------------------------------------------------------------------------------------

二、如何从外部读取局部变量?

出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。

那就是在函数的内部,再定义一个函数。

Js代码

function f1(){

n=999;

function f2(){
alert(n); // 999
}

}

在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1 就是不可见的。这就是Javascript语言特有的“链式作用域”结构(chain scope),

子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之

热点内容
手机f加密 发布:2024-05-19 03:28:47 浏览:225
用什么密码写日记 发布:2024-05-19 03:27:57 浏览:303
数据库access2003 发布:2024-05-19 02:49:39 浏览:620
碧蓝航线pc挂机脚本 发布:2024-05-19 02:30:03 浏览:589
脚本fir 发布:2024-05-19 02:28:57 浏览:261
阿里云独享服务器 发布:2024-05-19 02:23:54 浏览:253
织梦源码ga 发布:2024-05-19 02:23:20 浏览:571
java文件名后缀 发布:2024-05-19 02:14:39 浏览:956
快手点榜脚本 发布:2024-05-19 02:08:44 浏览:163
pythonforinkeys 发布:2024-05-19 01:55:44 浏览:793