作用域分为4种:

一.全局作用域window:函数外部定义的变量

注:1.var abc=123; 是全局变量,不能删除delete abc结果为false

       abcd=2345  没有用var定义的变量是作为window的属性使用,可以删除 delete abcd || delete window.abcd 结果为true

       2.在函数内部没有使用var定义的变量不具备函数作用域,它是具备全局作用域的,是window的属性不是全局作用域

二.函数作用域(局部作用域)function:在函数内部定义的变量,对外是封闭的,从外层的作用域无法直接访问函数内部的作用域

如果想在函数外部引用函数内部的值有两种方法

1.在函数内部return返回变量 

 

function test(){
   var a = 3
   return a
}
console.log(test())

 

 

2.使用闭包

function test(){
   var a = 2
   function test2(){
      return a
   }
   return test2()
}
console.log(test())
 

 

三.块状作用域{}

在es6之前没有块状作用域,关于什么是块,只要认识{}就可以

if(true){
  let a = 1
  console.log(a)
}

 

四.动态作用域this(只能在执行阶段才能决定变量的作用域,那就是动态作用域)

window.a=3
function test(){
  console.log(this.a) //a
}
test()
test.bind({a:100})()  //100

总结:JavaScript 默认采用词法(静态)作用域,如果要开启动态作用域请借助 bind、with、eval 等
function foo() {
console.log(a); // 2 (不是 3!)
}
function bar() {
var a = 3;
foo();
}
var a = 2;
bar();