js的变量和闭包的理解
2017-03-30 10:30
260 查看
最近项目里涉及到关于js方面的知识,花了点时间研究下,遂记录下来:
先来点开胃小知识:
1>全局变量和局部变量
全局变量:非局部变量就是全局变量,且在引入的多个js文件中通用。
局部变量:定义在方法内部的变量,函数的形参也属于。
在方法内部定义变量,一定要加var,否则会被定义为全局变量,例子如下:
2> js中什么可以作为if的条件?
1.布尔变量 true/false;
2.数字非0 (负数也是可以的) 为true
数字是0或者NaN 为false
3.字符串为非空串 为true
上述代码中c就是一个闭包,或者说 return (){return i++} 就是一个闭包,正是由于这个闭包的存在,使得a在执行完之后,并不会被GC回收,而是保存在内存中,如它的变量 i 一值存在,所以运行一次c() i 就加 1 。
闭包的第二种形式。
其他关于很复杂的闭包例子什么的,还等着继续理解。
这是参考的一个博客:
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
先来点开胃小知识:
1>全局变量和局部变量
全局变量:非局部变量就是全局变量,且在引入的多个js文件中通用。
局部变量:定义在方法内部的变量,函数的形参也属于。
在方法内部定义变量,一定要加var,否则会被定义为全局变量,例子如下:
var B = A(2); B(10); function A(x) { temp = 3; return function (y) { alert(x+y+(++temp)); } } alert(temp); //这里会输出4,因为temp是全局变量。 //注意:如果将代码里的头两行去掉,那么alert会报错,显示undefined,不是说temp是全局变量吗,怎么未定义? //这是因为 函数内部定义的变量,要在函数执行后才会真正定义 //这段代码内部执行情况是:执行A,发现一个没有用 var 定义的 temp 于是去全局变量中寻找是否有这个变量,结果没有,那么我就创建一个temp全局变量。
2> js中什么可以作为if的条件?
1.布尔变量 true/false;
2.数字非0 (负数也是可以的) 为true
数字是0或者NaN 为false
3.字符串为非空串 为true
重点来了
3>关于闭包的研究和理解。$(function () { function a() { var i = 999; return function () { return i++; } } var c = a(); //c指向了匿名函数function(){return i++} ,因此内部函数被a外一个变量应用。使得a一直存在。 var x = c(); //x指向i。 alert(x); x = c(); alert(x); /* 闭包的本质,就是可以读取其他函数内部变量的函数。 闭包的第一种形式: 当一个函数返回的是他内部的函数的时候 那么就是一个闭包。 当函数a的内部函数b 被函数a外的一个变量c引用的时候,就创建了一个闭包c 闭包的作用:使得a执行完毕后,GC不会回收a所占用的资源。 闭包的应用场景:1.在内存中维持一个变量,由于闭包c的存在,a中变量i可以一直维持。每次执行完c i会自动加1; 2.通过保护变量安全时限js私有属性和私有方法。 */
上述代码中c就是一个闭包,或者说 return (){return i++} 就是一个闭包,正是由于这个闭包的存在,使得a在执行完之后,并不会被GC回收,而是保存在内存中,如它的变量 i 一值存在,所以运行一次c() i 就加 1 。
闭包的第二种形式。
闭包:函数可以调用函数之外的变量。 var a="a" var n; var bFn=function(){ alert("a"); alert("b"); n=function(){ var c="c"; alert(c); } } n(); //n函数属于全局域,但可以调用bFn中的b,因为n指向它的内部函数。
其他关于很复杂的闭包例子什么的,还等着继续理解。
这是参考的一个博客:
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
相关文章推荐
- 对于JS语言的深刻理解(变量定义;作用域链;闭包;this)
- Js闭包中变量理解
- js特殊例子--方法内重新定义了变量在后面就会前面的为undifined,后面没有定义就用全局的--各种专业文献上的“闭包”(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函
- 谈谈自己对js闭包,执行上下文,作用域链,活动对象AO,变量对象VO的理解
- js中的闭包之我理解
- Js闭包理解
- 深入理解js闭包
- js中的闭包理解(closure)
- 简单说说我理解的js中的闭包
- JS闭包中未使用的引用变量回收机制浅探
- 理解Javascript_15_作用域分配与变量访问规则,再送个闭包
- JS 学习笔记--理解闭包
- javascript深入理解js闭包
- javascript技巧-javascript深入理解js闭包
- javascript深入理解js闭包
- js面向对象--理解闭包
- javascript深入理解js闭包
- 关于JS闭包的理解
- javascript深入理解js闭包