学习总结 javascript 闭包

学习地址 :http://stackoverflow.com/questions/111102/how-do-javascript-closures-work

1,关于闭包的简单实现

//example 1

function sayHello(name) {

var words = "hello," + name;

var sayForAlert = function () {

alert(words);

}

sayForAlert();

}

//sayHello("jack");

/*

An Example of a Closure

Two one sentence summaries:

a closure is the local variables for a function — kept alive after the function has returned, or

a closure is a stack-frame which is not deallocated when the function returns (as if a ‘stack-frame‘ were malloc‘ed instead of being on the stack!).

*/

function sayHello2(name){

var words = "hello, "+name; //local variables;

var sayForAlert =  function (){

alert(words);

}

return sayForAlert;

}

var say2 = sayHello2("lucy");

say2();

/*

一个函数的引用,作为一个参数返回回来。在这里相当于返回一个函数的

指针。sayForAlert 和 say2指向的是同一函数。

javascrip与c的一个重要区别在于c指针指向一个函数,而javascript是一个引用指向一个函数。(相当于是隐藏性指针)。

在许多的语言中和c一样,当函数执行完成后,本地的变量就不能再访问。

因为其函数的堆栈被销毁。

在javascript中函数的里面可以在声明函数。并且本地的变量可以访问,并

可心在声明的函数中返回。

*/

function saynumadd(){

var num = 666;

var showAlert = function(){

alert(num);

//num++;//place 2;

}

num++;//place 1;

return showAlert;

}

var sayNumber = saynumadd();

sayNumber();//alert 667;

/*

note: 根据上面的执行结果来看num做为一个变量被保存起来在后面

函数的调用可以再获取到。 如果我们把num++;放到place2的位置

看到的结果就是666.说明函数的执行顺序执行 saynumadd() 执行过程

中 1,声明变量num,2,声明函数 showAlert,3,把变量num自增加1;

当我们执行 sayNumber()的时候看到的就是667 增加后被保存的结果。

*/

function setupSomeGlobals(){

var num = 666;

//store some references to function as global variables

getAlertNumber = function (){

alert(num);

}

getIncreaseNumber = function(){

num ++;

}

getSetNumber = function(x){

num = x;

}

}

setupSomeGlobals();

getIncreaseNumber();

getAlertNumber();

getSetNumber(10);

getAlertNumber();//10

setupSomeGlobals();

getAlertNumber();//666

/*

onte:

从上面的例子可以看出,

setupSomeGlobals 里面的三个函数被声明都有权限去访问里面的变量。

如果我们重新调用 setupSomeGlobals() 新的函数堆栈会被创建. 之前创建的getAlertNumber, getIncreaseNumber, getSetNumber 会被重写并有一个新的闭包. (在 JavaScript中, 无论任何候都可以在function的内部声明另外一个function,外面的function被调用的时候,里面的function都会被重新创建.)

*/

function buildList( list ){

var result = [];

for (var i = 0 ; i<list.length; i ++){

var item = ‘item‘ + list[i];

result.push(function(){alert(item +‘    ‘+list[i])});

}

return result;

}

function testList(){

var fnList = buildList([1,2,3,4]);

for(var j=0; j < fnList.length; j ++){

fnList[j]();

}

}

testList();//alert item1  undefined;

/*

运行结果,可以说明function里面的function只可以保存本地变量,不能保存参数变量。所以我们在使用封包函数要注意其中变量的作用域。

*/

function callLocalVar(){

var sayAlertName = function(){alert(name)};

var name = "jacy";

return sayAlertName;

}

callLocalVar()();//这种写首先会执行callLocalVar再执行返回的sayAlertName;

/*

note:

总结闭包函数可以访问到同一个域时定义的变量,无论是在这个闭包函数的前面还是后面。 只要是同一个域就可以被访问到。

*/

function checkClosure(someNum, someRef){

var num = someNum;

var arr = [1,2,3];

var ref = someRef;

return function(x){

num += x;

arr.push(num);

alert(‘num :‘+num + ‘ \n arr :‘+arr.toString()

+‘\n ref.someVar‘+ref.someVar);

}

}

var obj = {someVar:4};

var fn1 = checkClosure(4,obj);

var fn2 = checkClosure(5,obj);

fn1(1);// num: 5; arr: 1,2,3,5; ref.someVar: 4;

fn2(1);// num: 6; arr: 1,2,3,6; ref.someVar: 4;

obj.someVar ++;

fn1(2);// num: 7; arr: 1,2,3,5,7; ref.someVar: 5;

fn2(2);//num: 8; arr: 1,2,3,6,8; ref.someVar: 5;

/*

note:

这里的写法解决了参数变量不能被保存的问题,只要创建一个本地作用域一个变量来接收这个参数变量的值就可以了。

可以说明不同的作用域,互相不影响。

*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 21:41:26

学习总结 javascript 闭包的相关文章

JavaScript闭包学习笔记

原文:JavaScript闭包学习笔记 闭包(closure)是JavaScript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于JavaScript初学者应该是很有用的. 一.变量的作用域 要理解闭包,首先必须理解JavaScript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. JavaScript语言的特殊之处,就在于函数内部可以直接读取全局变量. 1 var n=999; 2 3 function f1() { 4 alert

JavaScript闭包学习笔记(ife2015spring)

阮大的文章让我获益良多.学习Javascript闭包(Closure) 问题: 话说在做task2小练习4轮播图的时候遇到了一个问题.本来是想按哪个按钮,就播放到对应图片.但实际上最后出来的值都是5. 比如下面这个简化的例子. for(var i=1;i<5;i++){ e[i].onclick=function(){ console.log(i); }; } 本以为按第一个弹出一,按第二个弹出2.但实际上都弹出的是5.黑人问号脸? 这就是js坑的地方了.因为for循环结束以后,它的i并没有马上

JavaScript学习总结(十六)——Javascript闭包(Closure)

原文地址: http://www.cnblogs.com/xdp-gacl/p/3703876.html 闭包(closure)是Javascript语言的一个难点,也是它的特色, 很多高级应用都要依靠闭包实现.很早就接触过闭包这个概念了,但是一直糊里糊涂的,没有能够弄明白JavaScript的闭包到底是什么,有什么用,今天 在网上看到了一篇讲JavaScript闭包的文章(原文链接), 讲得非常好,这下算是彻底明白了JavaScript的闭包到底是个神马东东以及闭包的用途了,在此写出来和大家分

javascript 闭包学习

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function

javascript闭包的理解-韩烨

javascript闭包是javascript的难点,很多人对js闭包不是很理解,我对js闭包一开始也是云里雾里,我刚刚进兴安得力的时候,做的转正试题中就有一个对闭包理解的题目.如何理解javascript的闭包呢?下面我们一起来学习一下: 闭包的含义和理解 通俗地讲,JavaScript 中每个的函数都是一个闭包,但通常意义上嵌套的函数更能够体现出闭包的特性,请看下面这个例子: var generateClosure = function() { var count = 0; var get

javascript闭包如何实现函数的重载?

本文和大家分享的主要是妙用javascript闭包实现函数重载相关内容,一起来看看吧,希望对大家学习javascript有所帮助. 1.准备知识 1.1 闭包 闭包是一个函数在创建时,允许该自身函数访问并操作该自身函数以外的变量时所创建的作用域.闭包可以让函数访问所有存在于该函数声明时的作用域内的变量和函数. <script>         var outerValue = "ninja";         var later;         function oute

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

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

JavaScript闭包和this

1.闭包的理解:我的理解是,闭包就是能够读取其他函数内部变量的函数.由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数".所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁.(注:本段摘抄自阮一峰的网络日志•学习JavaScript闭包) 2.关于JavaScript中的this的理解

最简明的JavaScript闭包解释

最简明的JavaScript闭包解释 JavaScript是这几年最火的编程语言之一,从前端到服务器端,再到脚本,好像没有一个地方没有JavaScript的身影.这个世界上任何的一种事物的存在必然有其合理性,不要以为别人都是小人得志,学习众家的长处才能开阔视野,青出于蓝. JavaScript的闭包是其相对于好多传统语言不太容易理解的地方,其实并不是它有多难,因为我们好多朋友都是有其他语言背景的,比如C/C++或者Java,这样往往可能会有些先入为主的思维,导致不容易一下子转变过来,其实稍微习惯