MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1// Demonstrate that functions are objects and have __code property
2
3// Basic function
4function greet(name) {
5 return "Hello, " + name + "!";
6}
7
8// Functions are objects - we can add properties to them
9greet.callCount = 0;
10greet.description = "A greeting function";
11
12// Accessing function properties
13console.log("Function name: " + greet.name);
14console.log("Description: " + greet.description);
15
16// The __code property contains the function's bytecode/implementation
17console.log("\n--- Function __code property ---");
18console.log("greet.__code: " + greet.__code);
19console.log("Type of __code: " + typeof greet.__code);
20
21// We can call the function normally
22let result = greet("World");
23console.log("\nCalling greet('World'): " + result);
24
25// Demonstrate with a more complex function
26function fibonacci(n) {
27 if (n <= 1) {
28 return n;
29 }
30 return fibonacci(n - 1) + fibonacci(n - 2);
31}
32
33fibonacci.purpose = "Calculate Fibonacci numbers";
34fibonacci.complexity = "O(2^n) - exponential";
35
36console.log("\n--- Another function example ---");
37console.log("Function: " + fibonacci.name);
38console.log("Purpose: " + fibonacci.purpose);
39console.log("Complexity: " + fibonacci.complexity);
40console.log("fibonacci.__code: " + fibonacci.__code);
41
42// Call it
43console.log("fibonacci(7) = " + fibonacci(7));
44
45// Functions can be stored in objects
46let mathOps = {
47 add: function(a, b) { return a + b; },
48 multiply: function(a, b) { return a * b; }
49};
50
51console.log("\n--- Functions as object properties ---");
52console.log("mathOps.add: " + mathOps.add);
53console.log("mathOps.add.__code: " + mathOps.add.__code);
54console.log("mathOps.add(5, 3) = " + mathOps.add(5, 3));
55
56// Functions can be assigned to variables
57let myFunc = greet;
58myFunc.newProperty = "Added to the reference";
59
60console.log("\n--- Function assignment ---");
61console.log("myFunc === greet: " + (myFunc === greet));
62console.log("myFunc.__code: " + myFunc.__code);
63console.log("myFunc('Alice'): " + myFunc('Alice'));
64
65// Anonymous function
66let anon = function(x) { return x * 2; };
67console.log("\n--- Anonymous function ---");
68console.log("anon.__code: " + anon.__code);
69console.log("anon(21) = " + anon(21));