JS中,函数A return 出函数B,请问函数A和B的作用域是什么关系?是上下级关系还是平行关系?

发布于 2022-09-06 06:19:11 字数 903 浏览 17 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

川水往事 2022-09-13 06:19:11

作用域的理解是没问题的,除此之外你还应该理解this。你的return this.name你要搞清楚this指向了谁。

var ele = obj.getName();

此时的ele是一个函数,等价于function () {return this.name}

而你直接执行ele()的时候,这个this指向的是global,在浏览器中就是window

换个执行方式:

ele.call(obj); // "小王"
我家小可爱 2022-09-13 06:19:11
var name="大王";
var obj={
    name : "小王",
    getName:function(){

//可以将this传入函数
        return (function(obj){
                    return function (){
                        return obj.name;
                    } 
               })(this);


//或者这样写
        that = this ;
        return function(){
            return that.name;
        }
    }
};

//你原来这里调用函数时,函数内部的this指向了window或者global
//所以要用闭包将this传入到函数里,最后再调用。
//查找this值时会沿着作用域链搜索到你的obj对象里
//或者用call函数将this指向你的obj
//ele.call(obj)

var ele = obj.getName();//function(){return this.name;};
alert(ele());//小王

//或者用
alert(obj.getName()());//小王
[旋木] 2022-09-13 06:19:11

首先你的obj对象是写错的,其次你作理解是对的,你再去理解下this指向就没问题了

—━☆沉默づ 2022-09-13 06:19:11

你可以去看一下《你不知道的JavaScript》这一本书,里面详细说明了什么是闭包,和this的指向问题。

巷雨优美回忆 2022-09-13 06:19:11

首先你要知道js的作用域和this是不一样的,js是词法作用域,代码写好后作用域就确定了,也就是说上面第一个例子中,函数b的外部作用域永远是函数a的作用域,不管你对b做了什么都不会改变了。
如果照你的理解,函数a把函数b return出去后,它们的作用域是平行关系的话,那么你调用a()()时不会输出"x为:11",而是直接报x is not defined错误。因为函数b中没有x的定义,而函数a和函数b作用域是平行关系,不会访问a中的x变量,而是应该访问全局作用域下的x变量,显然你全局作用域下没有x变量的定义。

var x=1;
function a(){
    var x=10;
    return function b(){
        x++;
        alert("x为:"+x);
    }
}
a()()      //"x为:11"不是"x为:1",b中的x还是a中的x。

this是动态创建的,只有执行的时候才会确定this,而在普通函数中this指向的是调用函数的对象,也就是说函数调用者不同this是不一样的。你第二个例子中执行obj.getName()时返回了一个函数,我先记为foo,当你在执行foo()时,foo的调用者是window,所以this指向的是window,不是obj,当你obj.getName()返回函数后你可以认为返回的函数中的this跟obj无关,除非你强制把obj作为this绑定到函数里。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文