一道JavaScript函数问题

function fun(){
    console.log('foo');
    return {
      fun: function(){
        fun();
      }
    };
}

fun().fun(); // 'foo','foo'

fun().fun().fun(); // 错误:Cannot read property 'fun' of undefined

为什么会是这样的结果,JS菜鸟求解,花了好长时间都没弄明白,请赐教……

阅读 3k
6 个回答

第一行 fun().fun()
首先执行fun() 因为里面有console.log('foo') 所以这是第一个打印
然后执行下面的return 返回了个对象 然后就调用对象内的fun 然后在内部fun() 因为闭包,最外部fun不会被销毁,就会执行最外的fun 所有有了第二个打印

第二行 fun().fun().fun() 前面和上面一样 也会先输出两个foo 但fun().fun() 并没有return出来东西 所以是undefined

fun()执行完返回一个对象就是return的那个对象,包含一个名为fun的成员,所以fun().fun()是执行了function(){fun()},且返回了undefined,所以fun().fun().fun()就回报错了

function fun(){
    console.log('foo');
    return {
      fun: function(){
        return fun();
      }
    };
}

改成这个样子就能无限循环了,你那个没有把返回值反出去

function fun(){
        console.log('foo');
        return {
            fun: function(){
                fun();
                return this;
            }
        };
    }

    fun().fun(); // 'foo','foo'

    fun().fun().fun();

fun().fun()返回的undefined 所以不能继续.下去了

第一次执行的时候,返回值是

fun: function(){
    fun();
}

fun().fun()是取返回值的fun属性,然后执行,相当于

(function(){
    fun();
})();

看一下这次执行的函数,是没写return的。无返回值,返回值是undefined。fun().fun()的返回值无fun属性,fun().fun().fun当然报错了。

fun().fun().fun()
分开看:第一步:fun().fun()执行是

 fun: function(){
                fun();
                return this;
            }

是他,但他执行完后是没有人return的,函数没有return的话就返回undefined,
所以undefined就没有fun的属性了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题