作用域

作者: zhangjingbibibi | 来源:发表于2018-05-21 11:49 被阅读0次
  • 理解
    • 就是一块“底盘”,一个代码段所在区域
    • 它是静态的(相对于上下文对象),在编写代码时就确定了
  • 分类
    • 全局作用域
    • 函数作用域
    • 没有块作用域(ES6有了)
  • 作用
    • 隔离变量,不同作用域下同名变量不会有冲突
//没块作用域
  if(true) {
    var c = 3
  }
  console.log(c)
//输出 3

  var a = 10,
    b = 20
  function fn(x) {
    var a = 100,
      c = 300;
    console.log('fn()', a, b, c, x)
    function bar(x) {
      var a = 1000,
        d = 400
      console.log('bar()', a, b, c, d, x)
    }

    bar(100)
    bar(200)
  }
  fn(10);
  //输出
  // fn() 100 20 300 10
  //bar() 1000 20 300 400 100
  //bar() 1000 20 300 400 200

作用域与执行上下文

  • 区别1
    • 全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了,而不是在函数调用时
    • 全局执行上下文环境是在全局作用域确定之后,js代码马上执行之前创建
    • 函数执行上下文是在调用函数时,函数体代码执行之前创建
  • 区别2
    • 作用域是静态的,只要函数定义好了就一直存在,且不会再变化
    • 执行上下文是动态的,调用函数时创建,函数调用结束时就会自动释放
  • 联系
    • 执行上下文(对象)是从属于所在的作用域
    • 全局上下文环境===>全局作用域
    • 函数上下文环境===>对应的函数使用域
  var a = 10,
    b = 20
  function fn(x) {
    var a = 100,
      c = 300;
    console.log('fn()', a, b, c, x)
    function bar(x) {
      var a = 1000,
        d = 400
      console.log('bar()', a, b, c, d, x)
    }

    bar(100)
    bar(200)
  }
  fn(10);
  //3个作用域,4个上下文环境

作用域链

  • 理解
    • 多个上下级关系的作用域形成的链,它是方向是从下向上的(从内到外)
    • 查找变量时就是沿着作用域链来查找的
  • 查找一个变量的查找规则
    • 在当前作用域下的执行上下文中查找对应的属性,如果有直接返回,否则进入2
    • 在上一级作用域的执行上下文中查找对应的属性,如果有直接返回,否则进入3
    • 再次执行2的相同操作,直到全局作用域,如果还找不到就抛出找不到的异常
  var a = 1
  function fn1() {
    var b = 2
    function fn2() {
      var c = 3
      console.log(c)
      console.log(b)
      console.log(a)
      console.log(d)
    }
    fn2()
  }
  fn1();
  //输出 3 2 1 ERROR:Uncaught ReferenceError: d is not defined

作用域面试题

  var x = 10;
  function fn() {
    console.log(x);
  }
  function show(f) {
    var x = 20;
    f();
  }
  show(fn);
//输出10


  var fn = function () {
    console.log(fn)
  }
  fn()
//输出  function(){console.log(fn)}
  var obj = {
    fn2: function () {
//      console.log(this===obj);     //true
//   console.log(fn2)           //fn2 is not defined
//     console.log(this.fn2)   //function(){console.log(this.fn2)}
            console.log(obj.fn2);           //function(){console.log(this.fn2)}
    }
  }
  obj.fn2()
  //输出  见上面

相关文章

  • js作用域

    1 - 作用域 1.1 作用域概述 全局作用域 局部作用域(函数作用域) 1.2 全局作用域 1.3 局部作用域 ...

  • 作用域,作用域链

    1 - 作用域 1.1 作用域概述 全局作用域 局部作用域(函数作用域) 1.2 全局作用域 1.3 局部作用域 ...

  • 变量作用域

    变量作用域:静态作用域、动态作用域JS变量作用域:JS使用静态作用域JS没有块级作用域(全局作用域、函数作用域等)...

  • 一网打尽 JavaScript 的作用域

    JavaScript 的作用域包括:模块作用域,函数作用域,块作用域,词法作用域和全局作用域。 全局作用域 在任何...

  • 作用域

    词法作用域,动态作用域,全局作用域,局部作用域,函数作用域,块级作用域,有些地方还能看到隐式作用域和显示作用域。 ...

  • JS的作用域

    JS的作用域: 全局作用域、函数作用域、eval 作用域、块级作用域 全局作用域: 函数作用域: 结果截屏: 说...

  • [ES6]1.1作用域

    作用域 全局作用域(global/window) 函数作用域/局部作用域(function) 块状作用域({}) ...

  • C - 作用域

    C - 作用域 一个 C 变量的作用域可以是: 块作用域 函数作用域 函数原型作用域 或 文件作用域 作用域描述程...

  • JavaScript作用域分类

    JavaScript作用域分类全局作用域局部作用域函数作用域块级作用域catchwithlet 和 const 什...

  • JS基础---05作用域

    JavaScript基础 1 - 作用域 1.1 作用域概述 全局作用域 局部作用域(函数作用域) 1.2 全局作...

网友评论

      本文标题:作用域

      本文链接:https://www.haomeiwen.com/subject/vsrfjftx.html