Is it possible to call recursively a method from an object literal?
For example:
(function () {
'use strict';
var abc = ['A', 'B', 'C'],
obj = {
f: function () {
if (abc.length) {
abc.shift();
f(); // Recursive call
}
}
};
obj.f();
}());
Error: 'f' was used before it was defined.
Thanks.
Is it possible to call recursively a method from an object literal?
For example:
(function () {
'use strict';
var abc = ['A', 'B', 'C'],
obj = {
f: function () {
if (abc.length) {
abc.shift();
f(); // Recursive call
}
}
};
obj.f();
}());
Error: 'f' was used before it was defined.
Thanks.
Share Improve this question asked Jan 25, 2012 at 16:51 user972959user972959 3811 gold badge4 silver badges5 bronze badges3 Answers
Reset to default 17You can, by using a named function expression:
f: function myself() {
if (abc.length) {
abc.shift();
myself(); // Recursive call
}
}
A must-read: http://kangax.github.com/nfe/
f
is a method on your object. As a result, when you're in f
, this
will be the object to which f
is attached. So to recursively call f
, use this.f()
f: function () {
if (abc.length) {
abc.shift();
this.f(); // Recursive call
}
}
Just note that inside of f
, this
will only be the current object if f
is invoked as a method: obj.f();
If you do somethinig like: obj.f.call(lala);
, then this
will now be lala
. And if you do something like:
var func = obj.f;
func();
Now this
is the global object inside of f
(or undefined in strict mode)
There's no variable called f
defined anywhere in your code. Use obj.f()
(or this.f
if you know this
points to where it should).