延长作用域链

43 阅读1分钟

闭包

当一个函数返回另一个函数时,返回的函数可以访问其外部函数的变量,即使外部函数已经执行完毕。这样,外部函数的执行上下文就被保留在内存中,从而延长了作用域链。

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