function fun(){
console.log('foo');
return {
fun: function(){
fun();
}
};
}
fun().fun(); // 'foo','foo'
fun().fun().fun(); // 错误:Cannot read property 'fun' of undefined
为什么会是这样的结果,JS菜鸟求解,花了好长时间都没弄明白,请赐教……
function fun(){
console.log('foo');
return {
fun: function(){
fun();
}
};
}
fun().fun(); // 'foo','foo'
fun().fun().fun(); // 错误:Cannot read property 'fun' of undefined
为什么会是这样的结果,JS菜鸟求解,花了好长时间都没弄明白,请赐教……
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的属性了
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
第一行 fun().fun()
首先执行fun() 因为里面有console.log('foo') 所以这是第一个打印
然后执行下面的return 返回了个对象 然后就调用对象内的fun 然后在内部fun() 因为闭包,最外部fun不会被销毁,就会执行最外的fun 所有有了第二个打印
第二行 fun().fun().fun() 前面和上面一样 也会先输出两个foo 但fun().fun() 并没有return出来东西 所以是undefined