美文网首页前端开发那些事儿
小记·作用域|闭包|变量提升

小记·作用域|闭包|变量提升

作者: 某时橙 | 来源:发表于2021-05-28 21:25 被阅读0次

完全是些零碎的总结↓

变量提升?

栗子:

function test(){
console.log(foo);
var foo=1;
}

对于可执行代码,在其执行之初会有一个分析的过程,分析时会预处理函数的活动对象(AO),此时AO内部的foo初值为undefined,只有当真正执行到var foo时,才会赋值1,由于console.log在var之前,所以打印的foo是undefined(此时AO.foo=undefined)

简而言之:变量能提升是因为分析过程中,var声明的键被初始化了。

思维导图?

闭包?

JS是词法(静态)作用域,其作用域在创建(而不是执行时)确定,所以

let value = 1;
function foo() {
    console.log(value);
}
function bar() {
    let value = 2;
    foo();
}
bar();

结果是value=1
原因是
1.foo和bar被在全局代码中被创建,此时会初始化AO,作用域链,this,
2.foo和bar的作用域链都是[自己的AO,global.AO]
3.所以打印结果是1

这里涉及的作用域链,其完全与函数内部一个叫做[[Scopes]]的属性有关,不信看下例闭包

function foo() {
    let a=1
    function bar() {
      console.log(a)
    }
   return bar
}
console.dir(foo());
//打印结果↓↓
f bar()
arguments: null
caller: null
length: 0
name: "bar"
prototype: {constructor: ƒ}
__proto__: ƒ ()
[[FunctionLocation]]: VM50:3
[[Scopes]]: Scopes[2]
0: Closure (foo) {a: 1}
1: Global {window: Window, self: Window, document: document, name: "", location: Location, …}

[[Scopes]]内包含的就是变量对象VO,函数执行时找变量就是从Scopes的VO按序遍历来寻找的。
根据上面的解析过程,我们也可以如法炮制
原因:
1.全局代码下foo被创建,初始化AO,作用域链,this,此时foo的作用域链是[foo.AO,global.AO]
2.执行foo
3.bar被创建,此时bar的作用域链是[bar.AO,foo.[[Scopes]]]==[bar.AO,foo.AO,global.AO]
4.返回bar
5.bar的scopes没有变化,当然被保存了呀,所以闭包

相关文章

  • 2023-01-12

    变量提升调用栈块级作用域作用域链和闭包 闭包 => 作用域链(词法作用域) => 调用栈(栈溢出) => 上下文...

  • javaScript门道之闭包

    闭包的学习路径:变量的作用域 -> 闭包的概念 ->闭包的应用 1.变量的作用域 变量的作用域分为作用于全局和作用...

  • JS 闭包(Closure)

    参考阮一峰老师的JS 闭包 理解闭包前需要理解变量作用域、变量提升 JS作用域 那如何让它依次打印,12345呢;...

  • 小记·作用域|闭包|变量提升

    完全是些零碎的总结↓ 变量提升? 栗子: 对于可执行代码,在其执行之初会有一个分析的过程,分析时会预处理函数的活动...

  • 2018-07-11

    深入理解闭包: 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非...

  • 浓缩解读《JavaScript设计模式与开发实践》③

    三、闭包和高阶函数 3.1 闭包 3.1.1 变量的作用域 所谓变量的作用域,就是变量的有效范围。通过作用域的划分...

  • 闭包和高阶函数学习笔记

    一、闭包 闭包的形成与变量的作用域以及变量的生存周期密切相关。 1.1 变量的作用域 变量的作用域:指变量的有效范...

  • JS总结:(二)执行上下文、this、作用域与闭包

    知识点: 1、执行上下文 & 作用域链 & 变量提升 2、this 的七种使用场景 3、作用域与闭包:什么是闭包,...

  • 闭包、定时器

    一、什么是闭包? 有什么作用 1.变量的作用域  要理解闭包,首先必须理解JavaScript的变量作用域。变量的...

  • 浅析关于 JS 作用域的几个高频知识点

    闭包 词法作用域 变量提升 变量提升 什么是变量提升 顾名思义,变量提升指的是,在声明变量的时候,变量的声明位置会...

网友评论

    本文标题:小记·作用域|闭包|变量提升

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