要理解javascript的闭包 关键是弄明白三样事情
1.变量作用域
一言以蔽之 函数内部可以访问函数外部的字段 而反之不行
1 var n=999; 2 3 function f1(){ 4 alert(n); 5 } 6 7 f1(); // 999
1 function f1(){ 2 var n=999; 3 } 4 5 alert(n); // error
此处有一坑是 若在函数内声明变量不使用var关键字 相当于是声明全局变量 也就是window的变量
2.this的含义
this等于调用方法的对象
比如 obj.fun() this =obj
若直接是 fun() this= window
3.闭包的含义
闭包其实就是一个定义在函数内部的函数 使外部能访问函数内部的变量
1 function f1(){ 2 3 var n=999; 4 5 function f2(){ 6 alert(n); 7 } 8 9 return f2; 10 11 } 12 13 var result=f1(); 14 15 result(); // 999
其实就这么简单 让外部访问内部的变量 也就是让f1的局部变量n成为了全局变量
4. 思考题
若能理解这两题,则算是明白闭包的含义 请先仔细思考
代码一:
1 var name = "The Window"; 2 3 var object = { 4 name : "My Object", 5 6 getNameFunc : function(){ 7 fun = function(){ 8 return this.name; 9 }; 10 return fun; 11 } 12 13 }; 14 15 alert(object.getNameFunc()());
代码二:
1 var name = "The Window"; 2 3 var object = { 4 name : "My Object", 5 6 getNameFunc : function(){ 7 var that = this; 8 fun = function(){ 9 return that.name; 10 }; 11 return fun; 12 } 13 14 }; 15 16 alert(object.getNameFunc()());
5.思考题解析
1.输出"The Window"
当执行object.getNameFunc()时返回的是fun函数
object.getNameFunc()() 相当于是执行fun()
此时你翻上去看下this的含义 this等于调用方法的对象
fun()前没有对象 说明此时的对象默认是window 所以返回"The Window"
2.输出"My Object"
当执行object.getNameFunc()时 this=object 并把object保存在that变量中
所以当执行object.getNameFunc()()时 也就是fun() 虽然是此时默认对象是window
但调用的是that的name 也就是object
示例代码摘自阮一峰BOLG
时间: 2024-12-30 00:48:40