Skip to content

全局作用域和函数作用域

  1. JS有两种作用域:全局作用域和函数作用域

    • 内部的作用域能访问外部,反之不行。访问时从内向外依次查找。
    js
    var a=10;//定义全局作用域
    
    function add (){
        var b = 20;//定义在函数作用域
        b++;
        a++;
        console.log(a,b);//
    }
    • 如果在内部的作用域中访问了外部,则会产生闭包。
    • 内部作用域能访问的外部,取决于函数定义的位置,和调用无关;
    js
    var a = 10;
    
    function add(){
        a++;
    }
    
    function test(){
        var a = 40;
        add();//函数定义在全局作用域,自然访问的是全局的变量,和调用的位置无关。
        console.log(a);
    }
    
    test();//20
  2. 作用域内定义的变量、函数声明会提升到作用域顶部

js
console.log(a);//undefined
var a = 10;

function add (){
    //...
}


//相当于
var a;
console.log(a);
a=10;


//函数表达式
consoloe.log(minus);//undefined  函数表达式是赋值给变量的,不会做提升。但是这里会变量提升
const minus = function () {
    //
}

面试题

js
//1.  下面的代码输出什么
console.log(a, b, c);//undefined undefined [Function: c]
var a = 1;
var b = function () { };
function c() { }

//2. 下面的代码输出什么
var a = 1,
  b = 2;

function m1() {
  console.log(a);
  var a = 3;
  function m2() {
    console.log(a, b);
  }
  m2();
}

m1();
//undefined  3 2


//3.  下面的代码输出什么?(百度)

var a = 1;

function m1() {
  a++;
}

function m2() {
  var a = 2;
  m1();
  console.log(a);
}

m2();
console.log(a);
//主要考察的是加的哪个a,函数访问外部变量和调用的位置无关  2 2

MIT License