闭包和作用域

this

this要在执行的时候才能有确认值,定义是无法确认

var a = {
  name: 'A',
  fn: function () {
    console.log(this.name)
  }
}

a.fn() //this === a
a.fn.call({
  name: 'B' //this === {name:'B'}
})
var fn1 = a.fn // this === window
fn1()

作用域

​ js没有块级作用域 只有全局和函数作用域

if (true) { //无块级作用域
  var name = 'james'
}
console.log(name)


var a = 100

//全局和函数作用域
function foo() {
  var a = 2020
  console.log('fn', a)
}

console.log(a)

作用域链

当代码在一个环境中执行时,会创建变量对象的一个作用域链。

当在内部函数中,需要访问一个变量的时候,首先会访问函数本身的变量对象,是否有这个变量,如果没有,那么会继续沿作用域链往上查找,直到全局作用域。如果在某个变量对象中找到则使用该变量对象中的变量值。

闭包

函数与对其状态即词法环境lexical environment)的引用共同构成闭包closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。

function init() {
  var name = "Mozilla"; // name 是一个被 init 创建的局部变量
  return function displayName() { // displayName() 是内部函数,一个闭包
    console.log(name); // 使用了父函数中声明的变量
  }
}

var f = init();
var name = 'james'
f() //Mozilla

function init2(fn) {
  var name = 'james'
  fn()
}
var f = init();

init2(f)//Mozilla

常用于 函数作为返回值 和函数作为参数传递

你可能感兴趣的:(闭包和作用域)