美文网首页
作用域和闭包《你不知道的JavaScript-上》读书笔记1

作用域和闭包《你不知道的JavaScript-上》读书笔记1

作者: aliyu | 来源:发表于2017-10-17 23:18 被阅读27次

前言

5月份的时候立了一个flag,然后就被打脸。
辞职,失恋。
新的工作,频繁的加班。
走三步退两步的减肥计划。
堕落……

今天看了电影《被嫌弃的松子的一生》
隐隐的害怕。

往前走吧。

作用域

传统编译语言(执行前)

  • 分词/语法分析
    • 分解成词法单元
  • 解析/语法分析
    • 将词法单元流 --> AST树
  • 代码生成
    • AST树 --> 可执行代码

LHS和RHS

赋值:LHS
取值和其他:RHS

作用域分类

动态作用域

作用域作为运行时被动态确定的形式


function foo(){
    console.log(a); //3
}

function bar(){
    var a = 3;
    foo();
}

var a = 2;

bar();

词法作用域


function foo(){
    console.log(a); //2
}

function bar(){
    var a = 3;
    foo();
}

var a = 2;

bar();

欺骗词法作用域

这样的写法均会导致浏览器内核对javascript编译时很多优化失效。从而降低性能。

eval(),new Function()

将对象的属性当做作用域的标识符,从而创建一个新的词法作用域。
老实讲,我也不太理解上面一句话是什么意思。

在严格模式下,eval无法修改当前词法作用域。

with

将一个对象的引用当做作用域来处理。

在严格模式下,with被禁用。

匿名函数表达式

缺点

  • 错误栈难以追踪
  • 无法引用自身
  • 省略了描述性的名称

解决方法:行内函数表达式


(function aaa(){

})()

解决全局undefined被赋值为true

var undefined = true;

(function(undefined){

//do something
})()

块作用域

  • with
  • try/catch

小应用

如果一段代码后面是异步操作,由于异步位于同一个作用域,用块作用域有利于垃圾回收机制


//下面两行可用块作用域包裹,以便回收
var something = {/*...*/};
dosomething(something);

btn.addEventListener("click",function(evt){
    console.log("111");
})

提升

函数提升会高于变量提升,然后重复的var声明会被忽略
后面的函数提升会覆盖前面的函数提升

闭包

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即便该函数是在当前词法作用域外执行。

相关文章

  • 作用域和闭包

    目录 概述 作用域编译过程词法作用域全局作用域函数作用域 闭包循环和闭包闭包的用途性能 总结 概述 作用域和闭包一...

  • javaScript门道之闭包

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

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • 作用域和闭包《你不知道的JavaScript-上》读书笔记1

    前言 5月份的时候立了一个flag,然后就被打脸。辞职,失恋。新的工作,频繁的加班。走三步退两步的减肥计划。堕落…...

  • js闭包详解

    1.什么是闭包? 要了解什么是闭包,首先你要了解作用域。 js的作用域分两种,全局作用域和局部作用域。 我们知道在...

  • 3-6 作用域和闭包--作用域-代码演示

    3-6 作用域和闭包--作用域-代码演示 知识点1、块级作用域

  • JavaScript中的闭包

    1.什么是闭包 要理解什么是闭包,就得先理解变量的作用域。在JavaScript中,有两种作用域,全局作用域和函数...

  • 2018-01-07 关于javascript闭包和作用域的理解

    关于 javascript 闭包的一些思考 作用域 词法作用域 函数作用域 块作用域 闭包 什么是作用域? 作用域...

  • 2023-01-12

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

  • 闭包及其应用

    闭包 在了解闭包之前我们首先要了解变量的作用域。1、在es6之前作用域只有两种,即全局作用域和函数作用域。2、在函...

网友评论

      本文标题:作用域和闭包《你不知道的JavaScript-上》读书笔记1

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