您的位置:首页 > Web前端 > JavaScript

js的变量和闭包的理解

2017-03-30 10:30 260 查看
最近项目里涉及到关于js方面的知识,花了点时间研究下,遂记录下来:

先来点开胃小知识:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  闭包