javascript
examples
examples.js⚡javascript
/**
* =====================================================
* 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
`);