1.闭包是什么?
理解:个人理解为在一个函数中去使用其他一个或者多个函数内部的变量
定义:闭包是指一个函数能够访问并操作其外部作用域的变量的能力。
一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数)
作用:读取他函数内部的变量以及保存这些变量(不让其销毁,但可能带来了内存泄漏问题)
2.理解下javascript变量的作用域:
简单划分为全局作用域(global document),函数作用域(可以理解局部作用域,自己定义的一些函数内部的变量)
函数内部可以使用全局变量(注意:函数内部变量的声明必须使用var,否则系统默认为全局变量),而函数外部是不可以调用函数内部变量的,这就是作用域链。
同时闭包的返回值一定是全局的,否则无法保存下来。如果想用this,需要that=this搞过来一下。
3.代码跑起来:
var a=1;
function f(){
alert(a);
}
f(); // 1 这段代码说明函数内部可以使用全局变量的
4.代码跑起来:
function f(){
var a=1;
}
alert(a); // error
这段代码说明函数外部无法使用函数内部的局部变量
5.如何在函数外部正确使用函数内部变量 ???
简单的方法就是在内部函数外层再定义一层函数,并将内层函数return出去!
6.代码跑起来:
function f1(){
var a=1;
function f2(){
alert(a);
}
return f2;
}
var r=f1();//此时函数值发生变化指向了f2
r(); // 1
7.代码跑起来:
function f1(){
var n=1;
add=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var r=f1();
r(); // 1
add();
r(); // 2
可以理解为r现在指向为f2函数,并且他执行了两次!其中add是运算加和!
8.代码跑起来:
function f1(){
var n=1;
add=function(){
n+=1 ;
alert(n)
}
return add;
function f2(){
alert(n);
}
return f2;
}
var r=f1();
r()//2
r();//3
解释器解释js 从上到下 ,return结束执行
此时因为return了add,下面不在执行!
9.代码跑起来:
function f1(){
var n=1;
add=function(){
n+=1 ;
alert(n)
}
function f2(){
alert(n);
}
return f2;
}
var r=f1();
r()1
add();2
r();2
为什么是两个2
不要奇怪因为有一个是add中alert()输出2!
10.代码跑起来:
function f1(){
var n=1;
add=function(){
n+=1 ;
}
function f2(){
alert(n);
}
return f2;
}
var r=f1();
r() //1
add() //只让他做运算
r(); //2
删除add中alert(),这次只有一个2输出
11.代码跑起来:
var name = "Window";
var obj = {
name : "My",
getName : function(){
return function(){
return this.name;
};
}
};
alert(obj.getName()()); //windows
此时return回来的函数已经不再是obj的属性,返回的是一个为执行的函数表达式,
所以这是this指向全局函数(window)
不相信的的小朋友可以 alert 一下obj.getNAme()函数。
里面一定是function(){return this.name;};
12.代码跑起来:
var name = "Window";
var object = {
name : "My",
getName : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(obj.getName()());//my
此时改变了this指向 输出my