JavaScript对象文字方法:递归调用

JavaScript对象文字方法:递归调用,javascript,recursion,object-literal,function-literal,Javascript,Recursion,Object Literal,Function Literal,可以从对象文本递归调用方法吗 例如: (function () { 'use strict'; var abc = ['A', 'B', 'C'], obj = { f: function () { if (abc.length) { abc.shift(); f(); // Recursive call

可以从对象文本递归调用方法吗

例如:

(function () {
    'use strict';
    var abc = ['A', 'B', 'C'],
        obj = {
            f: function () {
                if (abc.length) {
                    abc.shift();
                    f(); // Recursive call
                }
            }
        };

    obj.f();
}());
错误:在定义之前使用了“f”


谢谢。

代码中没有定义名为
f
的变量。使用
obj.f()。因此,当您在
f
中时,
将是
f
所附加的对象。因此,要递归调用
f
,请使用
this.f()


请注意,在
f
的内部,
只有当
f
作为方法调用时,此
才会是当前对象:
obj.f()

如果你做了类似的事情:
obj.f.call(拉拉)
,然后
这个
现在将是
lala
。如果你做了以下事情:

var func = obj.f;
func();
现在
f
中的全局对象(或在严格模式下未定义)

您可以使用命名函数表达式:


必须阅读:

可能指向也可能不指向
obj
,具体取决于
f
的调用方式。最好在它以后咬到那个家伙之前把这件事弄清楚。@MattiVirkkunen-确实-编辑。谢谢你的提示,享受你的新徽章:)耶,这应该是你选择的答案。也谢谢你的链接。让它成为一个命名函数,究竟有什么可以绕过erorr的呢?创建自己的闭包?
var func = obj.f;
func();
        f: function myself() {
            if (abc.length) {
                abc.shift();
                myself(); // Recursive call
            }
        }