闭包
闭包是JavaScript中一个强大且常用的概念。它允许你在函数内部创建一个独立的作用域,并且可以访问外部函数的变量和参数。这种特性使得闭包在许多场景下非常有用。
function outerFunction() {
var outerVariable = "I'm outside!";
function innerFunction() {
console.log(outerVariable);
}
return innerFunction;
}
var inner = outerFunction();
inner(); // 输出 "I'm outside!"
在上面的例子中,innerFunction是一个闭包,它可以访问外部函数outerFunction中的outerVariable变量。
原型和原型链
JavaScript是一种基于原型的语言,每个对象都有一个原型。原型是一个对象,它包含共享的属性和方法。当你访问一个对象的属性或方法时,JavaScript会先在对象本身查找,如果找不到,就会去原型链上查找。
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log("Hello, " + this.name + "!");
};
var john = new Person("John");
john.sayHello(); // 输出 "Hello, John!"
在上面的例子中,Person函数是一个构造函数,通过new关键字创建了一个john对象。Person.prototype是john对象的原型,它包含了sayHello方法。
异步编程
JavaScript是一种单线程的语言,但是它支持异步编程。异步编程允许你在执行某个操作时,不会阻塞后续代码的执行。常见的异步编程模式包括回调函数、Promise和async/await。
// 使用回调函数
function fetchData(callback) {
setTimeout(function() {
var data = "Hello, world!";
callback(data);
}, 1000);
}
fetchData(function(data) {
console.log(data); // 输出 "Hello, world!"
});
// 使用Promise
function fetchData() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
var data = "Hello, world!";
resolve(data);
}, 1000);
});
}
fetchData().then(function(data) {
console.log(data); // 输出 "Hello, world!"
});
// 使用async/await
async function fetchData() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
var data = "Hello, world!";
resolve(data);
}, 1000);
});
}
async function main() {
var data = await fetchData();
console.log(data); // 输出 "Hello, world!"
}
main();
异步编程在处理网络请求、文件操作等场景中非常常见。
这只是JavaScript高级概念和技巧的一小部分,还有很多其他的内容,如模块化、错误处理、ES6+特性等。希望这篇文章对你有所启发!