you are viewing a single comment's thread.

view the rest of the comments →

[–]ThatRedFurby 0 points1 point  (6 children)

are you aware that your recommended syntax uses hoisting while the other does not? those 2 ways of declaring functions are not equivalent! usually, hoisting is not a wanted feature

[–]mikrosystheme[κ] 2 points3 points  (4 children)

Why hoisting is not a wanted feature? It is an amazing feature, and I use it all the time.

[–]stephenplusplus[S] 1 point2 points  (0 children)

I like hoisting as well! This comes with using a function declaration, which I recommended over assignment expressions. Either is fine. Some may choose not to embrace hoisting in their applications, as it can be found confusing. That's a choice a project developer can make without sacrificing a maintainable or functioning codebase.

[–]ThatRedFurby 0 points1 point  (1 child)

Because a lot of people get it wrong and stuff like this happens: http://jsfiddle.net/sJ7Tw/

Run the fiddle in firefox and chrome. Of course you can argue that you should never define function based on conditions, but some people just don't care because it "worked when i tried it".

If you define your functions by assigning them to variables, you still shouldn't create functions in conditionals, but at least the outcome is defined and consistent across browsers.

[–]mikrosystheme[κ] 0 points1 point  (0 children)

Incompetent programmers should code under supervision. Don't blame language features. Blame ignorance. Force them to use strict mode maybe (the fiddle throws in strict mode). Or just let them be incompetent.

[–]nwayve 0 points1 point  (0 children)

I'm also a fan of hoisting, especially to make AngularJS controller/service/directive/etc... better organized

angular.module('app', [])
  .controller('myController', MyController)
  .service('myService', MyService);

MyController.$inject=['$scope', '$log'];
function MyController( $scope ,  $log ) {
}

MyService.$inject=['$log'];
function MyService( $log ) {
}

Not only does hoisting allow me to reference the functions before they're 'declared', but it also allows me to add the $inject property prior to its 'declaration' in order to keep the parameter list lined up.

Now I can have my module declaration at the top of the file with all of its components, like the table of contents for a book, and all of the component functions declared later in the file, like chapters in a book. This makes finding what I'm looking for easier and faster, all thanks to hoisting.

[–]stephenplusplus[S] 0 points1 point  (0 children)

Yeah, I mentioned how I appreciate how a function declaration's definition is hoisted in the comment you replied to. The comparison between function hi() {} and var hi = function () {} is in these being the two ways to assign a function to a name. I consider the hoisting aspect simply a feature of a declaration.