Gahing's blog Gahing's blog
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Gahing / francecil

To be best
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前端基础

    • 编程语言

      • CSS

      • HTML

      • JavaScript

        • ECMAScript6入门
        • JS 手写题

        • JS技巧
        • JS 学习笔记
        • Promise then 原理分析
        • async 函数编译原理
        • 你不知道的JavaScript(上)
          • 前言
          • ① 作用域和闭包
            • 变量提升
          • 作用域闭包
          • 块作用域
        • 再谈闭包
        • 浏览器剪切板协议
        • 前端实现相对路径转绝对路径的几种方法
        • 为什么 0.._ 等于 undefined
        • 前端项目中常用的位操作技巧
        • 如何利用前端剪切板实现文件上传
        • 快速理解 JS 装饰器
        • 趣味js-只用特殊字符生成任意字符串
        • 重学 JS 原型链
        • 面试官问:怎么避免函数调用栈溢出
      • Rust

      • TypeScript

      • WebAssembly

    • 开发工具

    • 前端调试

    • 浏览器原理

    • 浏览器生态

  • 应用框架

  • 工程能力

  • 应用基础

  • 专业领域

  • 业务场景

  • 大前端
  • 前端基础
  • 编程语言
  • JavaScript
gahing
2018-02-01
目录

你不知道的JavaScript(上)草稿

# 前言

本篇为 《你不知道的JavaScript(上)》 的读书笔记。

其实,很多情况下就是因为我们没有熟读规范,导致一些我们认为想当然的用法与实际大相径庭。

该书作者就讲述了这样一些用法,可以避免各个阶段的开发者踩坑。

# ① 作用域和闭包

# 变量提升

foo() //TypeError
var foo = function(){}
/*
foo会被提升到全局,其运行顺序是这样的:
var foo
foo() //TypeError
foo = function(){}
*/

foo() //ReferenceError
let foo = function(){}

if(!obj in window){
	var obj = 3 
}
console.log(obj)
//obj编译的时候会被提到全局,实际效果是:
var obj
if(!obj in window){
	obj = 3 
}
console.log(obj)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 作用域闭包

想用iife循环输出1~5

for(var i =1;i<=5;i++){
	(function(){
		setTimeout(function(){console.log(i)},1000)
	})()
}
//输出5次6
1
2
3
4
5
6

这样是不行的,原因在于这个iife中的作用域是空的,setTimeout的执行顺序在循环之后,故又会去拿全局的i

所以需要传入当前的i到iife的作用域,setTimeout执行的时候就去取这个临时变量了

for(var i =1;i<=5;i++){
	(function(i){
		setTimeout(function(){console.log(i)},1000)
	})(i)
}
1
2
3
4
5

# 块作用域

想实现es6这样的效果

{
let a = 2;
console.log( a ); // 2
} console.log( a ); // ReferenceError
1
2
3
4

非es6环境下可以这样

try{throw undefined;}
catch(a){
	a = 2;
	console.log( a ); // 2
}
1
2
3
4
5
编辑 (opens new window)
上次更新: 2024/09/01, 23:56:56
async 函数编译原理
再谈闭包

← async 函数编译原理 再谈闭包→

最近更新
01
浅谈代码质量与量化指标
08-27
02
快速理解 JS 装饰器
08-26
03
Vue 项目中的 data-v-xxx 是怎么生成的
09-19
更多文章>
Theme by Vdoing | Copyright © 2016-2024 Gahing | 闽ICP备19024221号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式