这篇文章主要介绍“分析JavaScript闭包特性”,在日常操作中,相信很多人在分析JavaScript闭包特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分析JavaScript闭包特性”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!首先先简要总结闭包特性:函数的局部变量在函数返回之后仍然可用栈上的内存空间在函数返回之后仍在存在,不被回收给个例子。下面这段代码会返回一个函数的引用:function sayHello2(name) {var text = ‘Hello ‘ + name; // Local variablevar sayAlert = function() { alert(text); }return sayAlert;}say2 = sayHello2(‘Bob’);say2(); // alerts “Hello Bob”对于这段代码,C程序员可能会认为sayAlert和say2一样,都是指向一个函数的指针。但实际上它俩有一个重要区别:
在JavaScript中,你可以认为一个函数的指针变量同时拥有两个指针。一个指向这个函数,另一个隐藏的指针指向一个闭包。重点在于你的函数内是否引用的外部变量。在JavaScript中,如果你在一个函数内定义一个新的函数,那么这个新的函数就是一个闭包。
对于C或者其他高级语言,函数执行结束并返回之后,它所占用的栈空间将被释放回收。函数内定义的局部变量将不再可用。但在JavaScript中,并不这样。如上所示,函数执行结束后,它所占用的栈空间并不会被全部回收。上面是基本理论。更进一步,再来一个例子:function say667() {// Local variable that ends up within closurevar num = 666;var sayAlert = function() { alert(num); }num++;return sayAlert;}var sayNumber = say667();sayNumber(); // alerts 667这个例子说明:闭包中使用的函数局部变量并非是值拷贝,而是引用。say667()执行结束之后number所在的那块内存的值为667,而sayNumber()是在say667()执行结束之后才执行,当它访问number所在的内存时,结果自然也是667。再进一步,看看用closure时易发生的错误的例子:function buildList(list) {var result = [];for (var i = 0; i
var item = ‘item’ + list[i];result.push( function() {alert(item + ‘ ‘ + list[i])} );}return result;}function testList() {var fnlist = buildList([1,2,3]);// Using j only to help prevent confusion — could use i.for (var j = 0; j
fnlist[j]();}}时刻保持清醒:变量是在内存里的,闭包使用的是内存的引用而不是那块内存的值拷贝。当你在循环中定义函数(闭包)的时候得小心,它可能并不像你最开始想的那样工作。关键有两个:子函数使用的是外部函数的局部变量的引用。循环内只是定义了子函数,并没有执行这个字函数。最后,来一个最抽象的例子:function newClosure(someNum, someRef) {// Local variables that end up within closurevar num = someNum;var anArray = [1,2,3];var ref = someRef;return function(x) {num += x;anArray.push(num);alert(‘num: ‘ + num +’nanArray ‘ + anArray.toString() +’nref.someVar ‘ + ref.someVar);}}obj = {someVar: 4};fn1 = newClosure(4, obj);fn2 = newClosure(5, obj);fn1(1); // num: 5; anArray: 1,2,3,5; ref.someVar: 4;fn2(1); // num: 6; anArray: 1,2,3,6; ref.someVar: 4;obj.someVar++;fn1(2); // num: 7; anArray: 1,2,3,5,7; ref.someVar: 5;fn2(2); // num: 8; anArray: 1,2,3,6,8; ref.someVar: 5;这个例子说明,闭包的创建时机是在函数被调用的时候。每次函数调用都会生成一个新的闭包,也就是一块新的内存区域。因为函数每次调用都会新分配一块栈内存,这是一回事。最后我自己来总结一下闭包:函数的局部变量在其他地方被引用闭包有两种基本情况:闭包的返回值是一个函数,它其中使用了该闭包的局部变量;闭包内定义了内部函数,内部函数引用了闭包的局部变量每次函数调用,都会生成一个新的闭包,分配新的内存实例:(滑过tab)window.onload= function(){var tits = $(‘#tabTit1 li’)免费云主机、域名;var cons = $(‘#tabCon1 .con’);var len = cons.length;var liChange = function(){for(var n=0;n
tits[n].className = tits[n].className.replace(/s*cur/g,”);
cons[n].className = cons[n].className.replace(/s*cur/g,”);
}
}
for(var i = 0; i
tits[i].i = i;
tits[i].onmouseover = function(){
liChange();
cons[this.i].addClass(‘cur’);
tits[this.i].addClass(‘cur’);
}
}
};
到此,关于“分析JavaScript闭包特性”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注云技术网站,小编会继续努力为大家带来更多实用的文章!
tits[n].className = tits[n].className.replace(/s*cur/g,”);cons[n].className = cons[n].className.replace(/s*cur/g,”);}}for(var i = 0; i
tits[i].i = i;
tits[i].onmouseover = function(){
liChange();
cons[this.i].addClass(‘cur’);
tits[this.i].addClass(‘cur’);
}
}
};
到此,关于“分析JavaScript闭包特性”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注云技术网站,小编会继续努力为大家带来更多实用的文章!
tits[i].i = i;tits[i].onmouseover = function(){liChange();cons[this.i].addClass(‘cur’);tits[this.i].addClass(‘cur’);}}};到此,关于“分析JavaScript闭包特性”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注云技术网站,小编会继续努力为大家带来更多实用的文章!
今天小编给大家分享一下怎么使用dockerfile构建nginx镜像的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。dockerfile介绍doc…