javascript

examples

examples.js
/**
 * =====================================================
 * 5.1 FUNCTION DECLARATIONS - EXAMPLES
 * =====================================================
 * The foundation of JavaScript functions
 */

// =====================================================
// 1. BASIC FUNCTION DECLARATION
// =====================================================

console.log('--- Basic Function Declaration ---');

function sayHello() {
  console.log('Hello, World!');
}

sayHello();
sayHello();

// =====================================================
// 2. FUNCTION WITH PARAMETERS
// =====================================================

console.log('\n--- Function with Parameters ---');

function greet(name) {
  console.log('Hello, ' + name + '!');
}

greet('Alice');
greet('Bob');

function add(a, b) {
  console.log(`${a} + ${b} = ${a + b}`);
}

add(5, 3);
add(10, 20);

// =====================================================
// 3. RETURN STATEMENT
// =====================================================

console.log('\n--- Return Statement ---');

function square(num) {
  return num * num;
}

const result = square(5);
console.log('Square of 5:', result);
console.log('Square of 7:', square(7));

// Using return value in expressions
console.log('4² + 3² =', square(4) + square(3));

// =====================================================
// 4. FUNCTION WITHOUT RETURN
// =====================================================

console.log('\n--- Function Without Return ---');

function logMessage(message) {
  console.log('LOG:', message);
  // No return statement
}

const returnValue = logMessage('Test message');
console.log('Return value:', returnValue); // undefined

// =====================================================
// 5. DEFAULT PARAMETERS
// =====================================================

console.log('\n--- Default Parameters ---');

function greetUser(name = 'Guest', greeting = 'Hello') {
  console.log(`${greeting}, ${name}!`);
}

greetUser(); // "Hello, Guest!"
greetUser('Alice'); // "Hello, Alice!"
greetUser('Bob', 'Hi'); // "Hi, Bob!"
greetUser(undefined, 'Hey'); // "Hey, Guest!"

// =====================================================
// 6. REST PARAMETERS
// =====================================================

console.log('\n--- Rest Parameters ---');

function sum(...numbers) {
  let total = 0;
  for (const num of numbers) {
    total += num;
  }
  return total;
}

console.log('sum(1, 2):', sum(1, 2));
console.log('sum(1, 2, 3, 4, 5):', sum(1, 2, 3, 4, 5));
console.log('sum():', sum());

// Mix regular and rest parameters
function introduce(greeting, ...names) {
  console.log(greeting);
  for (const name of names) {
    console.log('- ' + name);
  }
}

introduce('Welcome:', 'Alice', 'Bob', 'Charlie');

// =====================================================
// 7. HOISTING
// =====================================================

console.log('\n--- Hoisting ---');

// Call before declaration - works!
console.log('Calling hoistedFunction:', hoistedFunction());

function hoistedFunction() {
  return 'I was hoisted!';
}

// Multiple calls
console.log('First call:', multiply(3, 4));
console.log('Second call:', multiply(5, 6));

function multiply(a, b) {
  return a * b;
}

// =====================================================
// 8. EARLY RETURN PATTERN
// =====================================================

console.log('\n--- Early Return Pattern ---');

function getDiscount(user) {
  if (!user) {
    return 0; // Guard clause
  }
  if (!user.isPremium) {
    return 0.05;
  }
  if (user.yearsActive > 5) {
    return 0.25;
  }
  return 0.15;
}

console.log('No user:', getDiscount(null));
console.log('Regular:', getDiscount({ isPremium: false }));
console.log('Premium 2yrs:', getDiscount({ isPremium: true, yearsActive: 2 }));
console.log('Premium 6yrs:', getDiscount({ isPremium: true, yearsActive: 6 }));

// =====================================================
// 9. RETURNING MULTIPLE VALUES
// =====================================================

console.log('\n--- Returning Multiple Values ---');

// Return as array
function minMax(arr) {
  if (arr.length === 0) return [null, null];
  return [Math.min(...arr), Math.max(...arr)];
}

const numbers = [3, 1, 4, 1, 5, 9, 2, 6];
const [min, max] = minMax(numbers);
console.log(`Min: ${min}, Max: ${max}`);

// Return as object
function getStats(arr) {
  if (arr.length === 0) return { count: 0, sum: 0, avg: 0 };
  const sum = arr.reduce((a, b) => a + b, 0);
  return {
    count: arr.length,
    sum: sum,
    avg: sum / arr.length,
  };
}

const stats = getStats([10, 20, 30, 40, 50]);
console.log('Stats:', stats);

// =====================================================
// 10. FUNCTIONS AS VALUES
// =====================================================

console.log('\n--- Functions as Values ---');

// Assign to variable
const myGreet = greet;
myGreet('Via variable');

// Store in array
const operations = [
  function (x) {
    return x + 1;
  },
  function (x) {
    return x * 2;
  },
  function (x) {
    return x * x;
  },
];

let value = 5;
for (const op of operations) {
  value = op(value);
  console.log('Value:', value);
}

// Store in object
const calculator = {
  add: function (a, b) {
    return a + b;
  },
  subtract: function (a, b) {
    return a - b;
  },
  multiply: function (a, b) {
    return a * b;
  },
  divide: function (a, b) {
    return a / b;
  },
};

console.log('10 + 5 =', calculator.add(10, 5));
console.log('10 * 5 =', calculator.multiply(10, 5));

// =====================================================
// 11. FUNCTIONS AS ARGUMENTS (CALLBACKS)
// =====================================================

console.log('\n--- Functions as Arguments ---');

function executeOperation(a, b, operation) {
  return operation(a, b);
}

function addNumbers(x, y) {
  return x + y;
}

function multiplyNumbers(x, y) {
  return x * y;
}

console.log('Execute add:', executeOperation(5, 3, addNumbers));
console.log('Execute multiply:', executeOperation(5, 3, multiplyNumbers));

// =====================================================
// 12. FUNCTIONS RETURNING FUNCTIONS
// =====================================================

console.log('\n--- Functions Returning Functions ---');

function createMultiplier(factor) {
  return function (number) {
    return number * factor;
  };
}

const double = createMultiplier(2);
const triple = createMultiplier(3);
const quadruple = createMultiplier(4);

console.log('double(5):', double(5)); // 10
console.log('triple(5):', triple(5)); // 15
console.log('quadruple(5):', quadruple(5)); // 20

// =====================================================
// 13. SCOPE EXAMPLE
// =====================================================

console.log('\n--- Function Scope ---');

const globalVar = "I'm global";

function outer() {
  const outerVar = "I'm in outer";

  function inner() {
    const innerVar = "I'm in inner";
    console.log(globalVar); // Accessible
    console.log(outerVar); // Accessible
    console.log(innerVar); // Accessible
  }

  inner();
  // console.log(innerVar);  // Error: not accessible
}

outer();
// console.log(outerVar);  // Error: not accessible

// =====================================================
// 14. NAMING CONVENTIONS IN ACTION
// =====================================================

console.log('\n--- Naming Conventions ---');

// Boolean functions (is/has/can)
function isValidEmail(email) {
  return email.includes('@') && email.includes('.');
}

function hasPermission(user, permission) {
  return user.permissions && user.permissions.includes(permission);
}

console.log(
  "isValidEmail('test@example.com'):",
  isValidEmail('test@example.com')
);
console.log("isValidEmail('invalid'):", isValidEmail('invalid'));

// Calculation functions
function calculateTotal(items) {
  return items.reduce((sum, item) => sum + item.price, 0);
}

const cart = [
  { name: 'Apple', price: 1.5 },
  { name: 'Bread', price: 2.0 },
  { name: 'Milk', price: 3.5 },
];
console.log('Total:', calculateTotal(cart));

// =====================================================
// 15. PRACTICAL EXAMPLE: USER PROCESSING
// =====================================================

console.log('\n--- Practical Example: User Processing ---');

function validateUser(user) {
  if (!user) return { valid: false, error: 'User is required' };
  if (!user.name) return { valid: false, error: 'Name is required' };
  if (!user.email) return { valid: false, error: 'Email is required' };
  if (!isValidEmail(user.email))
    return { valid: false, error: 'Invalid email' };
  return { valid: true };
}

function formatUser(user) {
  return {
    ...user,
    name: user.name.trim(),
    email: user.email.toLowerCase(),
  };
}

function processUser(user) {
  const validation = validateUser(user);
  if (!validation.valid) {
    console.log('Validation error:', validation.error);
    return null;
  }

  const formatted = formatUser(user);
  console.log('Processed user:', formatted);
  return formatted;
}

processUser(null);
processUser({ name: 'John' });
processUser({ name: '  John Doe  ', email: 'JOHN@EXAMPLE.COM' });

// =====================================================
// SUMMARY
// =====================================================

console.log('\n--- Summary ---');
console.log(`
Function Declarations:
  • Basic: function name(params) { return value; }
  • Hoisted: can call before definition
  • Default params: function greet(name = "Guest")
  • Rest params: function sum(...numbers)
  
Key Concepts:
  • return stops execution and returns value
  • No return means returns undefined
  • Functions are first-class citizens
  • Functions create their own scope
  
Best Practices:
  • Single responsibility
  • Descriptive names (verb + noun)
  • Early returns for readability
  • Limit number of parameters
`);
Examples - JavaScript Tutorial | DeepML