闭包
当一个函数返回另一个函数时,返回的函数可以访问其外部函数的变量,即使外部函数已经执行完毕。这样,外部函数的执行上下文就被保留在内存中,从而延长了作用域链。
function outerFunction() {
var outerVar = 'I am from outer function';
return function innerFunction() {
console.log(outerVar); // innerFunction has access to outerVar
};
}
var myFunc = outerFunction();
myFunc(); // 输出: I am from outer function
在这个例子中,innerFunction是一个闭包,它可以访问outerFunction的变量outerVar,即使outerFunction已经执行完毕。
with
可能会导致性能问题和代码可读性的降低。with语句会将指定的对象添加到作用域链的最前端,从而使该对象的属性可以直接访问。
var obj = { x: 10 };
with (obj) {
console.log(x); // 输出: 10
}
在这个例子中,with语句将obj对象添加到作用域链的最前端,因此在with语句块内可以直接访问obj的属性x。
try...catch
try...catch语句中的catch子句会在作用域链中添加一个异常对象,这个对象包含了捕获的异常信息。
try {
throw new Error('Something went wrong');
} catch (e) {
console.log(e.message); // 输出: Something went wrong
}
在这个例子中,catch子句将异常对象e添加到作用域链中,因此在catch块内可以直接访问e的属性message。