Reputation: 2963
I have been doing something like this for a while and I have never seen any errors. But, unfortunately, I have never been able to explain why this works.
The first line creates a variable which points to a function. The second line just adds func2
to func1
separated by a dot and defines a function.
If I add a var
in front of func1.func2
then I see a compilation error.
func1.func2 = function(){};
Error
SyntaxError: missing ; before statement
var func1.func2 = function(){};
What type was func1
on first line 1 and what did it become on line 2.
var func1 = function(){};
func1.func2 = function(){};
Upvotes: 0
Views: 181
Reputation: 7912
func1.func2 = function(){};
If func1
is not defined you are trying to access a property of undefined
which causes an exception to be thrown.
var func1.func2 = function(){};
// SyntaxError: Unexpected token .
JavaScript syntax does not allow a dot to be inserted in a variable's name and therefore the interpreter returns a syntax error error.
var func1 = function(){};
func1.func2 = function(){};
A function in javaScript is a Function object, therefore, as all javascript objecta a method can be added dynamically to it at run-time. So func1
is Function Object and func2
is another function object. This is the correct way to achieve what you are trying to do.
Upvotes: 1
Reputation: 147353
One form of variable statement is:
var identifier [optional assignment];
The identifier in a variable statement must meet the rules for identifier names, one of which is that they can't contain a "." character. So:
var func1 [...];
is OK but:
var func1.func2 [...];
is not. The interpreter stops at the identifier because it's a syntax error and that's it, it can't proceed with the assignment.
Upvotes: 2
Reputation: 94101
A function in JavaScript is an object too, that can have properties:
function func1(){} // a function object
console.log(func1.name); //=> "func1"
An anonymous function doesn't have a name but it's still a function object so:
What type was func1 on first line 1 and what did it become on line 2.
Still a function, with a property func2
containing another anonymous function.
Upvotes: 1
Reputation: 36592
func1
is a function on both lines. You can confirm this using typeof
:
var func1 = function(){};
typeof func1; // "function"
func1.func2 = function(){};
typeof func1; // "function"
Upvotes: 1