ShaggyInjun
ShaggyInjun

Reputation: 2963

variable declaration in javascript

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

Answers (4)

Giuseppe Pes
Giuseppe Pes

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

RobG
RobG

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

elclanrs
elclanrs

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

Evan Davis
Evan Davis

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

Related Questions