JavaScript 延长作用域链

1,069 阅读1分钟

执行环境及作用域

延长作用域链

⊄⊄虽然执行环境的类型总共只有两种——全局和局部(函数),但还是有其它方法来延长作用域链,这么说是因为有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。在两种情况下会发生这种现象。具体来说,就是当执行流程进入下列任何一个语句时,作用域链就会得到加长

try - catch 语句的 catch 块

with 语句

⊄⊄这两个语句都会在作用域链的前端添加一个变量对象。对with语句来说,会将指定的对象添加到作用域链中。对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的申明。

示例:

function buildUrl1() {
  var qs = "?debug=true";

  with (location) {
    var url = href + qs;
  }

  return url;
}

⊄⊄在此,with 语法接收的是 location 对象,因此其变量对象中就包含了 location 对象的所有属性和方法,而这个变量对象被添加到了作用域链的前端。buildUrl1() 函数中定义了一个变量 qs。当在 with 语句中引用变量 href 时(实际引用的是 location.href),可以在当前执行环境的变量对象中找到。当引用变量 qs 时,引用的则是在 buildUrl1() 中定义的那个变量,而该变量位于函数环境的变量对象中,至于 with 语句内部,则定义了一个名为 url 的变量,因而 url 就成了函数执行环境的一部分,所以可以作为函数的值被返回。