闭包和作用域

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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容