今天面试又跪在闭包上了,还是不能真正理解闭包。
看了阮一峰老师对闭包的理解并把思考题做完了,然后自己又加了难度,代码如下:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc: function () {
return function () {
return this.name;
}
}
};
var obj = {
name : 'wgm',
sayName: function (callback) {
callback();
}
}
console.log(
obj.sayName(object.getNameFunc())//undefined
);
为什么打印出来的是undefined
整个闭包没有什么问题,在
这一闭包函数里获取到的
this
确实是window
,你可以在这一层打印就知道。相反是有一个比较简单的地方楼主漏掉了,清楚来说
console
的内容是obj.sayName(...)
的返回值,但是这个函数有返回值么?callback()
执行完return
回的数据,没有变量来接受也没有被sayName
函数返回,所以结果才是undefined
,如果想得到正确的结果,楼主可以稍微修改一下成return callback();
就可以了。另外再简单解释一些闭包相关的一些概念,希望能助你加深对闭包理解。
JS的链式作用域特点就是,函数执行是从外往内进入,而从内往外返回,所以内层函数执行时可以获取到外层函数里定义的变量,但是外层函数返回的时候内层函数执行完毕已经在内存中销毁了,所以无法获取到内层函数作用域定义的变量,也就是变量无法向下层获取。那外层函数有时候需要获取内层函数的变量该怎办?于是闭包出现了,为了解决无法从内部函数获取变量的问题,在内层函数里再定义一个函数来获取它的变量返回给外层函数,有点像挖一新坑填一个老坑的意思,比如下面的代码:
如果没有
c
函数,a
函数就无法获取到b
函数里的bb
。所以闭包的使用是为了拿到内层函数的变量才存在的,没有这种需求的时候就不用使用闭包。