The use of named function expressions is not correctly implemented by at least IE 6-8.

The basic use case works fine (e.g.)
var foo = function callee() {
    // do something
    setTimeout(callee, 10);
};

But declared as
(function callee() {
    // do something
    setTimeout(callee, 10);
})();

the name callee leaks to the enclosing scope.

Also, the callee function inside the function body is not the same function. foo !== callee in IE.

So if you use the function as a namespace, callee.someProperty = "foo" is not exposed on foo.someProperty.

See http://lucassmith.name/pub/named_func_exp.html

Luke

On Sep 24, 2009, at 3:59 PM, Oliver Hunt wrote:


On Sep 24, 2009, at 3:55 PM, Charles Jolley wrote:

Given your example, a named function expression would do the job trivially:

ClassB = ClassA.extend({

  foo: function foo() {
    foo.base.apply(this, arguments); // calls super!
    // other code
  }

});

This works but, as I said, this approach has a couple of drawbacks:

1. The function has to be named twice (foo: function foo()). This makes the code harder to read (especially with long names) and its not very developer-friendly since its pointless cruft.

2. This is also fragile. If you forget the second name, the code would still parse but it will be seriously broken. Additionally, if you decided to rename the function you would also have to edit the code on the inside. Hurts the "copy and paste" aspect of it.

In general I think this particular approach is not developer friendly enough.
The function expression name is fairly irrelevant, so you could have a standard style guideline
foo : function callee() {
    callee.base.apply ...
}

--Oliver


_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to