as I have just learnt when you assign an object to a variable, or constant, in that variable it is not stored the actual object but a reference value to a certain point in the memory where the actual value of the object is stored. Thus, as I have also learnt function are objects. So, my question is. When you are declaring a function into a variable, is it the same process? The function is stored somewhere in the memory and the variable stores a reference value that points to a certain place in the memory?
            Asked
            
        
        
            Active
            
        
            Viewed 34 times
        
    -1
            
            
        - 
                    2that would seem to be correct – Jaromanda X Aug 24 '22 at 08:34
- 
                    Except for strings, numbers, null and booleans everything else in javascript are references - arrays, objects, functions etc. Weirdly even `undefined` is a reference – slebetman Aug 24 '22 at 08:37
- 
                    @slebetman everything in JavaScript is a value. It's just that sometimes a value is a reference. https://stackoverflow.com/a/6605700/989920 – evolutionxbox Aug 24 '22 at 08:37
- 
                    1@slebetman - *"Weirdly even undefined is a reference"* No, [`undefined` is a primitive value](https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#sec-ecmascript-language-types-undefined-type). You might be thinking of the fact that there's a global variable called `undefined` that contains the primitive value `undefined`, but it's not a reference of any kind. (Which is indeed weird, `undefined` should have been a keyword, like `null`.) – T.J. Crowder Aug 24 '22 at 08:38
1 Answers
2
            
            
        Yes, functions are objects, and yes the value stored in a variable for any object is a reference to the object, not a copy of it. That includes functions.
You can easily see that by making a change to the function object:
const f1 = function fn() { };
const f2 = f1;
f1.someProperty = 42;
console.log(f2.someProperty); // 42When you do:
const f1 = function() { };
you get something like this in memory (details omitted):
                       +−−−−−−−−−−−−−−−−−−+
f1:Ref13246−−−−−−−−−−−>|    (function)    |
                       +−−−−−−−−−−−−−−−−−−+
                       | name: "fn"       |
                       +−−−−−−−−−−−−−−−−−−+
Note the value in f1, which I've shown here conceptually as Ref13246. It tells the JavaScript engine where to find that object.
Now if you do:
const f2 = f1;
you have something like:
                 
f1:Ref13246−−−−−−+
                 |     +−−−−−−−−−−−−−−−−−−+
                 +−−−−>|    (function)    |
                 |     +−−−−−−−−−−−−−−−−−−+
f2:Ref13246−−−−−−+     | name: "fn"       |
                       +−−−−−−−−−−−−−−−−−−+
Notice how f2 and f1 have the same value in them, a reference that says where the function is.
Now when we do:
f1.someProperty = 42;
that modifies the function:
                 
f1:Ref13246−−−−−−+
                 |     +−−−−−−−−−−−−−−−−−−+
                 +−−−−>|    (function)    |
                 |     +−−−−−−−−−−−−−−−−−−+
f2:Ref13246−−−−−−+     | name: "fn"       |
                       | someProperty: 42 |
                       +−−−−−−−−−−−−−−−−−−+
You can see that new property on the function object regardless of which variable you get the reference from.
 
    
    
        T.J. Crowder
        
- 1,031,962
- 187
- 1,923
- 1,875
- 
                    Just for clarification. `f1` and `f2` have the same value and `f2` doesn't reference `f1`? – evolutionxbox Aug 24 '22 at 08:39
- 
                    @evolutionxbox - Right. Thanks, I should add a diagram, since that would otherwise be a valid conclusion. – T.J. Crowder Aug 24 '22 at 08:40
