为了账号安全,请及时绑定邮箱和手机立即绑定

js闭包的一个问题。。。

js闭包的一个问题。。。

var i = 2; function outFun() {     var i=1;     return function () {         return i;     } } console.log(outFun()());为什么上面的这段代码输出的结果是1?var name = "The Window"; var object = {     name: "My object",     getNameFunc: function() {         return function() {             return name;         };     } } console.log(object.getNameFunc()()) 这段代码,我的想法是:这个应该是个闭包,调用object.getNameFunc()返回的结果是一个闭包函数,同时会带着包含全局变量对象和object变量对象和getNameFunc的变量对象的作用域链出来。在window中运行,生成一个window的活动对象,推到作用域链的前端。在返回name时候先查找活动对象中所以就返回了“The Window”。这是我对这段代码的理解。我把这个思路套到上面那段代码中应该是返回2啊,为什么返回了1???这两个函数有什么不同吗?求大佬解答。。。谢谢、+++++++++++++++++++++++评论区里没换行的代码++++++++++++++++++++++++++var name = "The Window"; var object = {     age:18,     name: "My object",     getNameFunc: function() {         var name = "i am name";         return function() {             return name;         };     } }; var nameFunc = object.getNameFunc(); console.log(nameFunc.call(object)); console.log(nameFunc());
查看完整描述

1 回答

?
qq_药药_0

TA贡献52条经验 获得超27个赞

object.getNameFunc()执行后返回一个匿名函数:

function() {

    return name;

};

这段代码可以简化为

var name='The window';
console.log((function () {
    return name
})())

匿名函数并没有绑定到任何一个对象中。你可以简单的理解为,普通函数执行,通过作用域链访问到了全局变量值。因为你这里也没有this,也不存在this指向问题;

查看完整回答
反对 回复 2018-10-06
  • 小熊熊HELLO
    小熊熊HELLO
    谢谢,那个我还有个疑问。就是在getNameFun这个函数返回的匿名函数是不是一个闭包函数?以及函数返回的时候有没有带着作用域链一起返回?
  • 小熊熊HELLO
    小熊熊HELLO
    可能刚才回复的表述不大清楚。 我的意思是想问,这个返回的匿名函数是不是也包含着object中的name属性,只是访问不到。。。
  • qq_药药_0
    qq_药药_0
    首先抱歉我昨天没有仔细看你的那个题,回复的有点问题;昨天那个我当this处理了,是错误的;首先函数之间的作用域只有全局和函数作用域;也就是你所想的object中的那个name其实一点用都没有;函数的变量只会循着函数作用域寻访到全局; var name = "The Window"; var object = { name: "My object", getNameFunc: function() { var name='hello world' return function() { return name; }; } } console.log(object.getNameFunc()())//hello world 执行这个匿名函数,他会先去看看自己有没得name,没有再去看看上级函数getnamefunc有没得,还没有再去看看全局。你看看懂了没有
点击展开后面5
  • 1 回答
  • 0 关注
  • 969 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信