JS中,函数A return 出函数B,请问函数A和B的作用域是什么关系?是上下级关系还是平行关系?
JS中,函数A ,return 出函数B,请问函数A和B的作用域是什么关系?是上下级关系还是平行关系?
比如在学习闭包的时候,常常会遇到这样的例子:
function a(){
var x=10;
return function b(){
x++;
alert("x为:"+x);
}
}
显然在这种情况下,b()是a()的下级作用域,才能访问a()中的变量x。
而我目前理解的是:
函数A return出的函数B,它们的作用域是平行关系。
a()像我们的肚子,如果b()在肚子里面,那么b()确实是a()的下级作用域。但是现在b()被a()return出来了,就像从肚子里面排遗出来一样,那么b()就从a()中脱离出来了,所以我目前认为它们是平行关系。
因为还有个例子是这样的:
var name="大王";
var obj={
name="小王";
getName:function(){
return function(){
return this.name;
}
}
};
var ele=obj.getName();//function(){return this.name;};
alert(ele());//大王
//或者用
alert(obj.getName()());//大王
这个例子里面obj.getName() --> return出来的函数就是全局函数。
你看这里,对象的方法也是函数对不对?但这个例子就说明它return出来的函数不在这个方法的作用域里面,而是和对象平行的作用域。
所以很疑惑,请各位大神讲解讲解!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
作用域的理解是没问题的,除此之外你还应该理解
this
。你的return this.name
你要搞清楚this指向了谁。此时的ele是一个函数,等价于
function () {return this.name}
而你直接执行
ele()
的时候,这个this指向的是global,在浏览器中就是window
。换个执行方式:
首先你的obj对象是写错的,其次你作理解是对的,你再去理解下this指向就没问题了
你可以去看一下《你不知道的JavaScript》这一本书,里面详细说明了什么是闭包,和this的指向问题。
首先你要知道js的作用域和this是不一样的,js是词法作用域,代码写好后作用域就确定了,也就是说上面第一个例子中,函数b的外部作用域永远是函数a的作用域,不管你对b做了什么都不会改变了。
如果照你的理解,函数a把函数b return出去后,它们的作用域是平行关系的话,那么你调用a()()时不会输出"x为:11",而是直接报x is not defined错误。因为函数b中没有x的定义,而函数a和函数b作用域是平行关系,不会访问a中的x变量,而是应该访问全局作用域下的x变量,显然你全局作用域下没有x变量的定义。
this是动态创建的,只有执行的时候才会确定this,而在普通函数中this指向的是调用函数的对象,也就是说函数调用者不同this是不一样的。你第二个例子中执行obj.getName()时返回了一个函数,我先记为foo,当你在执行foo()时,foo的调用者是window,所以this指向的是window,不是obj,当你obj.getName()返回函数后你可以认为返回的函数中的this跟obj无关,除非你强制把obj作为this绑定到函数里。