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(){};
4 Answers 4
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.
Comments
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"
Comments
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.
Comments
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.
1 Comment
func1 is not defined then you'd get a reference error. The "trying to access X of undefined" error usually happens when you are trying to access a non-existing property of an object. Because in that case, the return value is actually undefined.
func1is a Function Object and as such, can have properties dynamically assignedvar func1, you are creating a new variable calledfunc1.func1.func2doesn't create a new variable, it adds a property to a variable that already exists.varin front of it, then you're creating a variable and variable names can't have periods. That's why you get an error.