掌握 JavaScript 函數:開發人員綜合指南

Fungsi JavaScript
Fungsi JavaScript ialah blok kod yang direka untuk melaksanakan tugas tertentu.
Fungsi JavaScript dilaksanakan apabila "sesuatu" memanggilnya (memanggilnya).
Fungsi JavaScript ialah konsep asas dalam bahasa, membolehkan anda merangkum kod ke dalam blok boleh guna semula. Berikut ialah gambaran keseluruhan:
Pengisytiharan Fungsi
Ini ialah cara yang paling biasa untuk menentukan fungsi. Anda menggunakan kata kunci fungsi diikuti dengan nama dan blok kod.
function greet(name) {
return `Hello, ${name}!`;
}
console.log(greet('Alice')); // Outputs: Hello, Alice!
1. Ungkapan Fungsi
Fungsi juga boleh ditakrifkan sebagai ungkapan dan diberikan kepada pembolehubah. Ini boleh berguna untuk mencipta fungsi tanpa nama atau apabila anda ingin menyampaikan fungsi sebagai argumen.
const greet = function(name) {
return `Hello, ${name}!`;
};
console.log(greet('Bob')); // Outputs: Hello, Bob!
2. Fungsi Anak Panah
Diperkenalkan dalam ES6, fungsi anak panah menawarkan sintaks yang lebih pendek. Ia amat berguna untuk fungsi sebaris dan mempunyai gelagat yang berbeza untuk kata kunci ini.
const greet = (name) => `Hello, ${name}!`;
console.log(greet('Charlie')); // Outputs: Hello, Charlie!
3. Fungsi dengan Parameter Lalai
Anda boleh memberikan nilai lalai untuk parameter fungsi, yang akan digunakan jika tiada nilai atau undefined diluluskan.
function greet(name = 'Guest') {
return `Hello, ${name}!`;
}
console.log(greet()); // Outputs: Hello, Guest!
console.log(greet('Dana')); // Outputs: Hello, Dana!
4. Parameter Rehat
Sintaks ... membolehkan anda mewakili bilangan argumen yang tidak ditentukan sebagai tatasusunan.
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3)); // Outputs: 6
console.log(sum(1, 2, 3, 4, 5)); // Outputs: 15
5. Skop Fungsi
Fungsi dalam JavaScript mempunyai skopnya sendiri. Pembolehubah yang diisytiharkan di dalam fungsi tidak boleh diakses dari luar.
function example() {
let localVar = 'I am local';
console.log(localVar); // Outputs: I am local
}
console.log(localVar); // ReferenceError: localVar is not defined
6. Memulangkan Nilai
Fungsi boleh mengembalikan nilai menggunakan kata kunci pulangan. Jika tiada pernyataan pemulangan digunakan, fungsi itu kembali tidak ditentukan secara lalai.
function add(a, b) {
return a + b;
}
console.log(add(5, 3)); // Outputs: 8
7. Ungkapan Fungsi Dipanggil Serta-merta (IIFE)
IIFE ialah fungsi yang berjalan sebaik sahaja ia ditakrifkan. Ia sering digunakan untuk mencipta skop baharu.
(function() {
console.log('I am an IIFE');
})();
8. Pembina Fungsi
Walaupun tidak biasa digunakan, anda boleh mencipta fungsi menggunakan pembina Fungsi.
const greet = new Function('name', 'return `Hello, ${name}!`');
console.log(greet('Eve')); // Outputs: Hello, Eve!
9. Penutupan
Penutupan ialah fungsi yang mempunyai akses kepada pembolehubah daripada skop fungsi lain. Ini ialah ciri hebat dalam JavaScript.
function makeCounter() {
let count = 0;
return function() {
count += 1;
return count;
};
}
const counter = makeCounter();
console.log(counter()); // Outputs: 1
console.log(counter()); // Outputs: 2
Jangan ragu untuk menyelami lebih mendalam mana-mana konsep ini atau tanya jika anda mempunyai soalan khusus!
Fungsi JavaScript mempunyai pelbagai sintaks, setiap satu berguna dalam konteks yang berbeza. Berikut ialah gambaran keseluruhan terperinci:
Parameter Fungsi
Parameter fungsi JavaScript mentakrifkan nilai yang boleh diterima oleh fungsi apabila ia dipanggil. Parameter ini membolehkan fungsi menjadi lebih fleksibel dan boleh digunakan semula. Berikut ialah pandangan terperinci tentang pelbagai aspek parameter fungsi JavaScript:
1. Parameter Asas
Apabila mentakrifkan fungsi, anda menentukan parameter dalam definisi fungsi. Apabila fungsi dipanggil, anda memberikan hujah yang sepadan dengan parameter ini.
Contoh:
function greet(name, age) {
console.log(`Hello, ${name}! You are ${age} years old.`);
}
greet('Alice', 30); // Outputs: Hello, Alice! You are 30 years old.
2. Parameter Lalai
Anda boleh menetapkan nilai lalai kepada parameter. Jika tiada nilai atau undefined diluluskan untuk parameter ini, nilai lalai akan digunakan.
Contoh:
function greet(name = 'Guest', age = 18) {
console.log(`Hello, ${name}! You are ${age} years old.`);
}
greet(); // Outputs: Hello, Guest! You are 18 years old.
greet('Bob'); // Outputs: Hello, Bob! You are 18 years old.
greet('Charlie', 25); // Outputs: Hello, Charlie! You are 25 years old.
3. Parameter Rehat
Parameter rehat membolehkan anda mewakili bilangan argumen yang tidak ditentukan sebagai tatasusunan. Ini berguna apabila anda tidak tahu berapa banyak hujah yang akan diluluskan.
Contoh:
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3)); // Outputs: 6
console.log(sum(1, 2, 3, 4, 5)); // Outputs: 15
4. Pemusnahan Parameter
Penstrukturan membolehkan anda membongkar nilai daripada tatasusunan atau sifat daripada objek ke dalam pembolehubah berbeza secara terus dalam parameter fungsi.
Contoh dengan Pemusnahan Objek:
function displayInfo({ name, age }) {
console.log(`Name: ${name}, Age: ${age}`);
}
const person = { name: 'Alice', age: 30 };
displayInfo(person); // Outputs: Name: Alice, Age: 30
Contoh dengan Pemusnahan Tatasusunan:
function sum([a, b]) {
return a + b;
}
console.log(sum([5, 10])); // Outputs: 15
5. Parameter Susunan dan Rehat Parameter
Apabila menggunakan kedua-dua parameter biasa dan parameter rehat, parameter rehat mestilah parameter terakhir dalam definisi fungsi.
Contoh:
function logInfo(name, age, ...additionalInfo) {
console.log(`Name: ${name}, Age: ${age}`);
console.log('Additional Info:', additionalInfo);
}
logInfo('Alice', 30, 'Engineer', 'Loves JavaScript');
// Outputs:
// Name: Alice, Age: 30
// Additional Info: ['Engineer', 'Loves JavaScript']
6. Parameter Dinamakan (Argumen Objek)
Menggunakan objek sebagai parameter membolehkan anda menghantar argumen bernama. Ini amat berguna untuk fungsi dengan banyak parameter atau parameter pilihan.
Contoh:
function createProfile({ name, age, job }) {
console.log(`Name: ${name}, Age: ${age}, Job: ${job}`);
}
createProfile({ name: 'Alice', age: 30, job: 'Developer' });
// Outputs: Name: Alice, Age: 30, Job: Developer
7. Function Overloading
JavaScript does not support function overloading in the traditional sense (same function name with different parameter lists). Instead, you can handle different parameter scenarios inside a function.
Example:
function process(value1, value2) {
if (value2 === undefined) {
console.log(`Processing single value: ${value1}`);
} else {
console.log(`Processing two values: ${value1} and ${value2}`);
}
}
process(5); // Outputs: Processing single value: 5
process(5, 10); // Outputs: Processing two values: 5 and 10
8. Arguments Object
In non-arrow functions, the arguments object provides access to all the arguments passed to a function. It is an array-like object but does not have array methods.
Example:
function printArguments() {
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
printArguments('a', 'b', 'c');
// Outputs:
// a
// b
// c
Function Call
This is the standard way to invoke a function by simply calling its name followed by parentheses.
Example:
function greet(name) {
console.log(`Hello, ${name}!`);
}
greet('Alice'); // Outputs: Hello, Alice!
1. Method Invocation
When a function is a property of an object, it's called a method. You invoke it using dot notation or bracket notation.
Example:
const person = {
name: 'Bob',
greet: function() {
console.log(`Hello, ${this.name}!`);
}
};
person.greet(); // Outputs: Hello, Bob!
2. Constructor Invocation
Functions invoked with the new keyword act as constructors and create new instances of objects. In this case, this refers to the newly created object.
Example:
function Person(name) {
this.name = name;
}
const person1 = new Person('Charlie');
console.log(person1.name); // Outputs: Charlie
3. Function Invocation Using call and apply
The call and apply methods allow you to invoke a function with a specific this context and arguments.
-
call Method: Passes arguments separately.
Example:
function greet(greeting, punctuation) { console.log(`${greeting}, ${this.name}${punctuation}`); } const person = { name: 'Dana' }; greet.call(person, 'Hello', '!'); // Outputs: Hello, Dana! -
apply Method: Passes arguments as an array.
Example:
function greet(greeting, punctuation) { console.log(`${greeting}, ${this.name}${punctuation}`); } const person = { name: 'Eva' }; greet.apply(person, ['Hi', '.']); // Outputs: Hi, Eva.
4. Arrow Functions Invocation
Arrow functions do not have their own this context; they inherit this from the surrounding scope.
Example:
const person = {
name: 'Frank',
greet: () => {
console.log(`Hello, ${this.name}!`); // 'this' refers to the surrounding scope, not the 'person' object
}
};
person.greet(); // Outputs: Hello, undefined!
5. Using bind
The bind method creates a new function with a specific this context and optional arguments.
Example:
function greet(greeting) {
console.log(`${greeting}, ${this.name}!`);
}
const person = { name: 'Grace' };
const greetPerson = greet.bind(person, 'Welcome');
greetPerson(); // Outputs: Welcome, Grace!
6. Immediately Invoked Function Expression (IIFE)
An IIFE is a function expression that is immediately executed after its definition.
Example:
(function() {
console.log('I am an IIFE!');
})(); // Outputs: I am an IIFE!
7. Dynamic Function Invocation
JavaScript functions can be dynamically invoked using the Function constructor or the eval function, though these approaches are less common and generally discouraged due to security and performance concerns.
Example Using Function Constructor:
const dynamicFunc = new Function('a', 'b', 'return a + b;');
console.log(dynamicFunc(2, 3)); // Outputs: 5
Example Using eval:
const code = 'console.log("Hello from eval!")';
eval(code); // Outputs: Hello from eval!
Function Return
In JavaScript, a function's return statement is crucial for specifying the output or result of the function. Here’s a detailed look at how return works and its various nuances:
1. Basic Usage
A function can return a value using the return statement. When the return statement is executed, the function terminates, and the specified value is sent back to the caller.
Example:
function add(a, b) {
return a + b;
}
const result = add(5, 3);
console.log(result); // Outputs: 8
2. Returning Early
A function can use return to exit early before reaching the end of its block. This is often used to handle special cases or invalid inputs.
Example:
function divide(a, b) {
if (b === 0) {
return 'Error: Division by zero';
}
return a / b;
}
console.log(divide(10, 2)); // Outputs: 5
console.log(divide(10, 0)); // Outputs: Error: Division by zero
3. Implicit Return (Arrow Functions)
In arrow functions with a single expression, the return keyword can be omitted. The expression is automatically returned.
Example:
const multiply = (a, b) => a * b; console.log(multiply(4, 5)); // Outputs: 20
4. Returning Multiple Values
JavaScript functions can only return one value. However, you can return multiple values by using an object or array.
Using an Object:
function getPerson() {
return {
name: 'Alice',
age: 30
};
}
const person = getPerson();
console.log(person.name); // Outputs: Alice
console.log(person.age); // Outputs: 30
Using an Array:
function getCoordinates() {
return [40.7128, -74.0060]; // latitude and longitude
}
const [latitude, longitude] = getCoordinates();
console.log(latitude); // Outputs: 40.7128
console.log(longitude); // Outputs: -74.0060
5. Returning undefined
If a function does not have a return statement, or if the return statement does not specify a value, the function returns undefined.
Example:
function greet(name) {
console.log(`Hello, ${name}!`);
// No return statement
}
const result = greet('Bob');
console.log(result); // Outputs: undefined
6. Returning from Recursive Functions
In recursive functions, the return statement is used to return values at each level of recursion.
Example:
function factorial(n) {
if (n === 0) {
return 1;
}
return n * factorial(n - 1);
}
console.log(factorial(5)); // Outputs: 120
7. Returning from Constructors
When using constructors (functions invoked with new), the return statement can be used to return a different object. If no return statement is provided, the newly created instance is returned by default.
Example:
function Person(name) {
this.name = name;
// Optional return statement
// return { name: name }; // This would override the default instance
}
const person = new Person('Alice');
console.log(person.name); // Outputs: Alice
8. Returning from Closures
Functions within closures can return values that depend on variables from their outer function.
Example:
function createCounter() {
let count = 0;
return function() {
count += 1;
return count;
};
}
const counter = createCounter();
console.log(counter()); // Outputs: 1
console.log(counter()); // Outputs: 2
Functions Used as Variable Values
In JavaScript, functions can be assigned to variables, which allows them to be treated as first-class objects. This means functions can be passed around as values, stored in variables, and used in various ways. Here’s a comprehensive look at how functions can be used as variable values:
1. Assigning Functions to Variables
You can assign a function to a variable, effectively creating a function expression.
Example:
const greet = function(name) {
return `Hello, ${name}!`;
};
console.log(greet('Alice')); // Outputs: Hello, Alice!
In this example, greet is a variable that holds a function. The function can be called using greet().
2. Function Expressions
Function expressions are functions that are defined inside expressions and can be assigned to variables.
Example:
const add = function(a, b) {
return a + b;
};
console.log(add(2, 3)); // Outputs: 5
3. Arrow Functions as Variable Values
Arrow functions provide a concise syntax and can also be assigned to variables.
Example:
const multiply = (x, y) => x * y; console.log(multiply(4, 5)); // Outputs: 20
4. Passing Functions as Arguments
Functions assigned to variables can be passed as arguments to other functions. This is a common pattern in JavaScript.
Example:
function executeFunction(fn, value) {
return fn(value);
}
const double = x => x * 2;
console.log(executeFunction(double, 5)); // Outputs: 10
5. Returning Functions from Other Functions
Functions can return other functions. This technique is used in functional programming and closures.
Example:
function createMultiplier(factor) {
return function(x) {
return x * factor;
};
}
const double = createMultiplier(2);
const triple = createMultiplier(3);
console.log(double(5)); // Outputs: 10
console.log(triple(5)); // Outputs: 15
6. Storing Functions in Arrays
Functions can be stored in arrays and accessed or invoked using array indices.
Example:
const functions = [
function(a) { return a + 1; },
function(a) { return a * 2; },
function(a) { return a - 3; }
];
console.log(functions ); // Outputs: 6
console.log(functions ); // Outputs: 10
console.log(functions ); // Outputs: 2
7. Storing Functions in Objects
Functions can be properties of objects and accessed using dot notation or bracket notation.
Example:
const math = {
add: function(a, b) { return a + b; },
subtract: function(a, b) { return a - b; }
};
console.log(math.add(10, 5)); // Outputs: 15
console.log(math.subtract(10, 5)); // Outputs: 5
8. Using Functions as Event Handlers
In event-driven programming, functions are often assigned to variables and used as event handlers.
Example:
const button = document.getElementById('myButton');
const handleClick = () => {
alert('Button clicked!');
};
button.addEventListener('click', handleClick);
9. Using Functions as Callbacks
Functions assigned to variables can be passed as callbacks to other functions.
Example:
function processArray(arr, callback) {
return arr.map(callback);
}
const numbers = [1, 2, 3, 4, 5];
const squaredNumbers = processArray(numbers, x => x * x);
console.log(squaredNumbers); // Outputs: [1, 4, 9, 16, 25]
10. Dynamic Function Creation
Functions can be created dynamically and assigned to variables, such as using the Function constructor.
Example:
const createAdder = new Function('a', 'b', 'return a + b;');
console.log(createAdder(2, 3)); // Outputs: 5
Local Variables
Variables declared within a JavaScript function, become LOCAL to the function.
Local variables can only be accessed from within the function.
// code here can NOT use carName
function myFunction() {
let carName = "Volvo";
// code here CAN use carName
}
// code here can NOT use carName
Function Invocation
In JavaScript, function invocation refers to the various ways a function can be executed. The manner in which a function is invoked affects its behavior, particularly the this context and the function’s scope. Here’s a detailed overview of different methods of function invocation:
1. Direct Invocation
The most straightforward way to invoke a function is to call it directly by using its name followed by parentheses.
Example:
function greet(name) {
console.log(`Hello, ${name}!`);
}
greet('Alice'); // Outputs: Hello, Alice!
2. Method Invocation
When a function is a property of an object, it is called a method. It is invoked using the dot notation or bracket notation on the object.
Example:
const person = {
name: 'Bob',
greet: function() {
console.log(`Hello, ${this.name}!`);
}
};
person.greet(); // Outputs: Hello, Bob!
3. Constructor Invocation
Functions invoked with the new keyword are treated as constructors. They create a new instance of an object. In this context, this refers to the newly created object.
Example:
function Person(name) {
this.name = name;
}
const person1 = new Person('Charlie');
console.log(person1.name); // Outputs: Charlie
4. Using call() Method
The call() method allows you to invoke a function with a specific this context and individual arguments. It’s useful for borrowing methods from other objects.
Example:
function greet(greeting, punctuation) {
console.log(`${greeting}, ${this.name}${punctuation}`);
}
const person = { name: 'Dana' };
greet.call(person, 'Hello', '!'); // Outputs: Hello, Dana!
5. Using apply() Method
The apply() method is similar to call(), but it takes arguments as an array. This method is useful when you have an array of arguments that need to be passed to the function.
Example:
function greet(greeting, punctuation) {
console.log(`${greeting}, ${this.name}${punctuation}`);
}
const person = { name: 'Eva' };
greet.apply(person, ['Hi', '.']); // Outputs: Hi, Eva.
6. Using bind() Method
The bind() method creates a new function with a specific this value and optionally pre-set arguments. This new function can be invoked later.
Example:
function greet(greeting, punctuation) {
console.log(`${greeting}, ${this.name}${punctuation}`);
}
const person = { name: 'Frank' };
const boundGreet = greet.bind(person, 'Welcome');
boundGreet('!'); // Outputs: Welcome, Frank!
7. Immediately Invoked Function Expression (IIFE)
An IIFE is a function expression that is immediately executed after its definition. It’s often used to create a new scope to avoid polluting the global namespace.
Example:
(function() {
console.log('I am an IIFE!');
})(); // Outputs: I am an IIFE!
8. Arrow Functions
Arrow functions are a concise syntax for writing functions and they don’t have their own this. Instead, this is inherited from the surrounding lexical scope.
Example:
const person = {
name: 'Grace',
greet: () => {
console.log(`Hello, ${this.name}!`); // 'this' refers to the surrounding scope, not the 'person' object
}
};
person.greet(); // Outputs: Hello, undefined!
9. Using Function Constructor
You can dynamically create functions using the Function constructor, though it is generally less common and less safe due to potential performance and security issues.
Example:
const dynamicFunc = new Function('a', 'b', 'return a + b;');
console.log(dynamicFunc(2, 3)); // Outputs: 5
10. Function Expressions and Assignments
Functions can be assigned to variables and then invoked. This includes both named and anonymous functions.
Example:
const add = function(a, b) {
return a + b;
};
console.log(add(2, 3)); // Outputs: 5
Function apply()
The apply() method in JavaScript is used to call a function with a given this value and arguments provided as an array (or an array-like object). It’s part of the Function.prototype and is very useful for invoking functions with a specific context and arguments.
Here’s a detailed breakdown of how apply() works:
Syntax
func.apply(thisArg, [argsArray])
- func: The function you want to call.
- thisArg: The value to use as this when calling the function.
- argsArray: An array or array-like object of arguments to pass to the function.
Example
Suppose you have a function that adds two numbers:
function add(a, b) {
return a + b;
}
You can use apply() to call this function with a specific this value (though in this simple case, this isn’t used) and an array of arguments:
const result = add.apply(null, [3, 4]); console.log(result); // Outputs: 7
Using apply() with this
When calling methods on objects, apply() can be used to specify the this value. This is particularly useful for methods that need to be called in the context of a different object.
Example:
const person = {
name: 'Alice',
greet: function(greeting) {
return `${greeting}, ${this.name}!`;
}
};
const anotherPerson = {
name: 'Bob'
};
console.log(person.greet.apply(anotherPerson, ['Hello'])); // Outputs: Hello, Bob!
In this example, greet is called on anotherPerson instead of the person object.
Using apply() with Math Methods
apply() is often used with Math methods to pass an array of numbers as individual arguments.
Example:
const numbers = [5, 6, 2, 8, 3]; const maxNumber = Math.max.apply(null, numbers); console.log(maxNumber); // Outputs: 8
In this example, Math.max is called with the numbers in the array spread out as individual arguments.
Comparison with call()
The call() method is similar to apply(), but it takes arguments individually rather than as an array.
Example with call():
function greet(greeting, punctuation) {
return `${greeting}, ${this.name}${punctuation}`;
}
const person = { name: 'Charlie' };
console.log(greet.call(person, 'Hi', '!')); // Outputs: Hi, Charlie!
Function bind()
The bind() method in JavaScript is used to create a new function with a specific this context and, optionally, pre-set arguments. This is particularly useful for setting the context of this when passing functions around or for partial function application.
Here’s a detailed overview of how bind() works and how it can be used:
Syntax
function.bind(thisArg, arg1, arg2, ...)
- thisArg: The value to which this should be bound in the new function.
- arg1, arg2, ...: Optional parameters that are pre-set and will be provided to the function when it is called.
Example 1: Basic Usage
The most basic use of bind() is to create a new function where this is fixed to a specific value.
function greet(greeting) {
console.log(`${greeting}, ${this.name}!`);
}
const person = { name: 'Alice' };
const boundGreet = greet.bind(person, 'Hello');
boundGreet(); // Outputs: Hello, Alice!
In this example, boundGreet is a new function created by bind() where this is permanently set to the person object.
Example 2: Partial Application
bind() can also be used for partial application, where you pre-set some arguments and leave others to be provided later.
function multiply(a, b) {
return a * b;
}
const double = multiply.bind(null, 2);
console.log(double(5)); // Outputs: 10
In this example, double is a function that multiplies its argument by 2. The bind() method creates this new function by fixing 2 as the first argument.
Example 3: Using with Methods
bind() is particularly useful when dealing with methods that need to be used as callbacks but must retain the correct this context.
Example with Event Handlers:
class Counter {
constructor() {
this.count = 0;
this.increment = this.increment.bind(this); // Fixes 'this' context
}
increment() {
this.count += 1;
console.log(this.count);
}
}
const counter = new Counter();
document.getElementById('incrementButton').addEventListener('click', counter.increment);
In this example, increment needs to have the correct this context when called as an event handler. By using bind(), this in increment correctly refers to the Counter instance.
Example 4: Multiple Arguments
You can also use bind() to fix multiple arguments.
function displayInfo(age, occupation) {
console.log(`Name: ${this.name}, Age: ${age}, Occupation: ${occupation}`);
}
const person = { name: 'Bob' };
const boundDisplayInfo = displayInfo.bind(person, 30);
boundDisplayInfo('Engineer'); // Outputs: Name: Bob, Age: 30, Occupation: Engineer
Here, boundDisplayInfo has this set to person and the first argument (age) is pre-set to 30.
Differences from call() and apply()
While call() and apply() can also set the this context and pass arguments, they invoke the function immediately. bind() creates a new function that, when called, will have its this set to the specified value and will use the provided arguments.
- call(): Invokes the function immediately with a specified this and arguments.
function showInfo(age, occupation) {
console.log(`Name: ${this.name}, Age: ${age}, Occupation: ${occupation}`);
}
const person = { name: 'Charlie' };
showInfo.call(person, 28, 'Teacher'); // Outputs: Name: Charlie, Age: 28, Occupation: Teacher
- apply(): Similar to call(), but arguments are passed as an array.
function showInfo(age, occupation) {
console.log(`Name: ${this.name}, Age: ${age}, Occupation: ${occupation}`);
}
const person = { name: 'Dana' };
showInfo.apply(person, [32, 'Artist']); // Outputs: Name: Dana, Age: 32, Occupation: Artist
- bind(): Returns a new function with this and optionally arguments set.
function showInfo(age, occupation) {
console.log(`Name: ${this.name}, Age: ${age}, Occupation: ${occupation}`);
}
const person = { name: 'Eva' };
const boundShowInfo = showInfo.bind(person, 40);
boundShowInfo('Scientist'); // Outputs: Name: Eva, Age: 40, Occupation: Scientist
Closures
In JavaScript, a closure is a powerful concept where a function retains access to its lexical scope even after the function has finished executing. Closures allow functions to access variables from an outer scope that have already executed, which is useful for creating private variables, factory functions, and more.
Here’s a detailed overview of closures:
What is a Closure?
A closure is created when a function is defined inside another function, and the inner function retains access to the outer function’s variables. This allows the inner function to "close over" the variables of its outer function.
Example:
function outerFunction() {
let outerVariable = 'I am from outer function';
function innerFunction() {
console.log(outerVariable); // Inner function has access to outerVariable
}
return innerFunction;
}
const closureFunction = outerFunction();
closureFunction(); // Outputs: I am from outer function
In this example:
- outerFunction returns innerFunction.
- innerFunction retains access to outerVariable even after outerFunction has finished executing.
- The variable outerVariable is preserved in the closure.
Characteristics of Closures
Access to Outer Variables: Closures can access variables from their containing (outer) scope even after the outer function has completed execution.
Encapsulation: Closures can be used to create private variables and methods, which are not directly accessible from outside the closure.
Persistent State: Closures can maintain state across multiple invocations.
Examples of Closures
1. Private Variables:
Closures are commonly used to create private variables in JavaScript, which are not accessible from outside the closure.
function createCounter() {
let count = 0; // Private variable
return function() {
count += 1;
console.log(count);
};
}
const counter = createCounter();
counter(); // Outputs: 1
counter(); // Outputs: 2
counter(); // Outputs: 3
In this example:
- count is a private variable that is not directly accessible from outside createCounter.
- The returned function is a closure that maintains access to count.
2. Function Factories:
Closures can be used to create factory functions that generate other functions with specific behavior.
function createGreeting(greeting) {
return function(name) {
console.log(`${greeting}, ${name}!`);
};
}
const sayHello = createGreeting('Hello');
const sayGoodbye = createGreeting('Goodbye');
sayHello('Alice'); // Outputs: Hello, Alice!
sayGoodbye('Bob'); // Outputs: Goodbye, Bob!
In this example:
- createGreeting is a function factory that returns a function with a specific greeting.
- The returned function retains access to the greeting variable.
3. Event Handlers:
Closures are often used in event handlers to preserve context and state.
function setupButton(buttonId) {
let clickCount = 0;
document.getElementById(buttonId).addEventListener('click', function() {
clickCount += 1;
console.log(`Button clicked ${clickCount} times`);
});
}
setupButton('myButton');
In this example:
- clickCount is a private variable that is maintained across multiple button clicks.
- The event handler function is a closure that retains access to clickCount.
Closures and this Context
Closures can sometimes lead to confusion with the this context, especially in object-oriented programming. Arrow functions, which do not have their own this, are often used in conjunction with closures to avoid issues related to this.
Example with Arrow Functions:
function Counter() {
this.count = 0;
setInterval(() => {
this.count += 1; // Arrow function does not have its own 'this'
console.log(this.count);
}, 1000);
}
const counter = new Counter();
In this example:
- The arrow function inside setInterval retains the this context of the Counter instance, allowing access to this.count.
以上是掌握 JavaScript 函數:開發人員綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!
熱AI工具
Undress AI Tool
免費脫衣圖片
Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片
AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。
Clothoff.io
AI脫衣器
Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!
熱門文章
熱工具
記事本++7.3.1
好用且免費的程式碼編輯器
SublimeText3漢化版
中文版,非常好用
禪工作室 13.0.1
強大的PHP整合開發環境
Dreamweaver CS6
視覺化網頁開發工具
SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
熱門話題
如何在JS中與日期和時間合作?
Jul 01, 2025 am 01:27 AM
JavaScript中的日期和時間處理需注意以下幾點:1.創建Date對像有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設置時間信息可用get和set方法,注意月份從0開始;3.手動格式化日期需拼接字符串,也可使用第三方庫;4.處理時區問題建議使用支持時區的庫,如Luxon。掌握這些要點能有效避免常見錯誤。
為什麼要將標籤放在的底部?
Jul 02, 2025 am 01:22 AM
PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl
什麼是在DOM中冒泡和捕獲的事件?
Jul 02, 2025 am 01:19 AM
事件捕獲和冒泡是DOM中事件傳播的兩個階段,捕獲是從頂層向下到目標元素,冒泡是從目標元素向上傳播到頂層。 1.事件捕獲通過addEventListener的useCapture參數設為true實現;2.事件冒泡是默認行為,useCapture設為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委託,提高動態內容處理效率;5.捕獲可用於提前攔截事件,如日誌記錄或錯誤處理。了解這兩個階段有助於精確控制JavaScript響應用戶操作的時機和方式。
如何減少JavaScript應用程序的有效載荷大小?
Jun 26, 2025 am 12:54 AM
如果JavaScript應用加載慢、性能差,問題往往出在payload太大,解決方法包括:1.使用代碼拆分(CodeSplitting),通過React.lazy()或構建工具將大bundle拆分為多個小文件,按需加載以減少首次下載量;2.移除未使用的代碼(TreeShaking),利用ES6模塊機制清除“死代碼”,確保引入的庫支持該特性;3.壓縮和合併資源文件,啟用Gzip/Brotli和Terser壓縮JS,合理合併文件並優化靜態資源;4.替換重型依賴,選用輕量級庫如day.js、fetch
JavaScript模塊上的確定JS綜述:ES模塊與COMPORJS
Jul 02, 2025 am 01:28 AM
ES模塊和CommonJS的主要區別在於加載方式和使用場景。 1.CommonJS是同步加載,適用於Node.js服務器端環境;2.ES模塊是異步加載,適用於瀏覽器等網絡環境;3.語法上,ES模塊使用import/export,且必須位於頂層作用域,而CommonJS使用require/module.exports,可在運行時動態調用;4.CommonJS廣泛用於舊版Node.js及依賴它的庫如Express,ES模塊則適用於現代前端框架和Node.jsv14 ;5.雖然可混合使用,但容易引發問題
如何在node.js中提出HTTP請求?
Jul 13, 2025 am 02:18 AM
在Node.js中發起HTTP請求有三種常用方式:使用內置模塊、axios和node-fetch。 1.使用內置的http/https模塊無需依賴,適合基礎場景,但需手動處理數據拼接和錯誤監聽,例如用https.get()獲取數據或通過.write()發送POST請求;2.axios是基於Promise的第三方庫,語法簡潔且功能強大,支持async/await、自動JSON轉換、攔截器等,推薦用於簡化異步請求操作;3.node-fetch提供類似瀏覽器fetch的風格,基於Promise且語法簡單
垃圾收集如何在JavaScript中起作用?
Jul 04, 2025 am 12:42 AM
JavaScript的垃圾回收機制通過標記-清除算法自動管理內存,以減少內存洩漏風險。引擎從根對像出發遍歷並標記活躍對象,未被標記的則被視為垃圾並被清除。例如,當對像不再被引用(如將變量設為null),它將在下一輪迴收中被釋放。常見的內存洩漏原因包括:①未清除的定時器或事件監聽器;②閉包中對外部變量的引用;③全局變量持續持有大量數據。 V8引擎通過分代回收、增量標記、並行/並發回收等策略優化回收效率,降低主線程阻塞時間。開發時應避免不必要的全局引用、及時解除對象關聯,以提升性能與穩定性。
var vs Let vs const:快速JS綜述解釋器
Jul 02, 2025 am 01:18 AM
var、let和const的區別在於作用域、提升和重複聲明。 1.var是函數作用域,存在變量提升,允許重複聲明;2.let是塊級作用域,存在暫時性死區,不允許重複聲明;3.const也是塊級作用域,必須立即賦值,不可重新賦值,但可修改引用類型的內部值。優先使用const,需改變變量時用let,避免使用var。


