最近项目里涉及到关于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