JS红宝书-- 4.2 执行环境及作用域

所有变量(包括基本类型和引用类型)都存在一个执行环境(也称为作用域链)当中,这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。

  • 执行环境有全局执行环境(也称为全局环境)和函数执行环境之分
  • 每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链
  • 函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全局环境
  • 全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据
  • 变量的执行环境有助于确定应该何时释放内存
var color = "blue";
function changeColor(){
  var anotherColor = "red";
  function swapColors(){
    var tempColor = anotherColor;
    anotherColor = color;
    color = tempColor;
    // 可以访问 color、anotherColor、tempColor
  }
  // 可以访问 color、anotherColor,不能访问tempColor
  swapColors();
}
// 只能访问color
changeColor();

三个执行环境: 全局环境、 changeColor()局部环境、swapColor()局部环境;
swapColor()其作用域包含3个对象:swapColor()的变量对象、changeColor()的变量对象和全局变量对象;
swapColor()局部环境开始会先在自己的变量对象中搜索变量和函数名,如果搜索不到再搜索上一级作用域链。

延长作用域链

  • try-catch语句的catch块:创建新的变量对象,其中包含的是被抛出的错误对象的声明

  • with 语句:会将指定的对象添加到作用域链中

function buildUrl(){
  var qs = "?debug=true";
  with(location){
    var url = href + qs;
  }
  return url;
}

没有块级作用域

  • 声明变量

使用var声明的变量会自动被添加到最接近的环境

在函数内部,最接近的环境就是函数的局部环境

function add(num1,num2){
  var sum = sum1 + sum2;
  return sum;
}
var result = add(10,20) ;     //30
alert(sum) ;    //由于sum不是有效的变量,因此会导致错误

若初始化没有使用var声明,该变量会自动被添加到全局环境

function add(num1,num2){
  sum = sum1 + sum2;
  return sum;
}
var result = add(10,20);      //30
alert(sum) ;                 //30
  • 查询标识符
var color = "blue";
function getColor(){
  return color;
}
alert(getColor());    //  "blue"
var color = "blue";
function getColor(){
  var color = "red";
  return color;
}
alert(getColor());    //  "red"

你可能感兴趣的:(JS红宝书-- 4.2 执行环境及作用域)