你不知道的JavaScript 笔记

一. 作用域


  1. 作用域是什么?

  • 作用域是存储变量的一套规则,比如函数作用域,块作用域,全局作用域
  • 作用域组成: 引擎 编译器 作用域
  • 举例: var a = 1 分为两个阶段: 1. 编译阶段声明变量 2. 执行阶段赋值

  • LHS: 变量赋值 RHS: 变量查找

  • 编译的原理

    js–(分词/词法分析(tokenizing/Lexing))–>有意义代码块–(解析/语法分析)–>AST–(代码生成)–> 执行代码

    • js引擎: 先编译后执行

  • 二. 词法作用域

    作用域的两种工作模式: 词法作用域和动态作用域
    1. 查找:作用域查找会在找到第一个匹配标识符停止
    2. 欺骗词法

    eval:修改作用域 with:创建新的作用域
    后果:导致js引擎在静态分析时停止优化,导致性能下降

    三. 函数作用域和块级作用域

    遵循最小授权原则
    1. 隐藏内部实现
    2. 规避冲突
    3. 立即执行函数(IIFE)

    四. 提升

    • var a = 1 –> var a;(编译阶段) a=1; (执行阶段)
    • 优先级: 函数提升> 变量提升

    五. 作用域和闭包

    闭包: 基于词法作用域书写代码产生,在词法作用域以外执行
    1. 函数内定义,外部调用
    2. 函数内定义匿名函数,并执行 如:定时器和事件绑定
    循环和闭包:
    var后面的i会覆盖前面的i,let每次创建是块作用域不会覆盖,也可以用户IIFE创建一个函数作用域防止覆盖
    模块
    模块模式的两个条件:
    1. 必须有外部的封装的函数,并至少执行一次
    2. 封装函数至少返回一个内部函数
    基于函数的模块只有在运行时才能被考虑,无法静态分析 import不需要

    动态作用域: 运行时决定
    静态作用域: 定时时确定

    第二部分 this和对象原型

    一. 关于this

    为什么使用?
    - 可以隐式传递一个对象的引用,代码更加优雅
    - 特点: 动态绑定,取决于调用的位置

    二. this全面解析

    调用位置:
    this所在函数被称为调用栈,调用栈在全局,this调用位置就是全局作用域
    绑定规则:
    1. 默认绑定 全局对象|undefined
    2. 隐式绑定 函数调用 隐式丢失:var bar = obj.foo() bar()
    3. 显示绑定 call apply 硬绑定: bind 软绑定 new 绑定
    - 优先级: 硬绑定 > new 绑定 > 软绑定
    - 绑定例外: 忽略this foo.call(null)
    - ES6 无法绑定this, 继承外层作用域this

    三. 对象

    • 创建: 字面量和构造函数
    • 一个bug: null是值类型,typeof缺失object 原因是typeof会将二进制前三位为0的判断的为对象,null全都是0
    • 内容: 属性访问和键访问(可以不是有效标识符)
    • 数组: 本质也是对象,[][‘name’] = ‘iwen’ [][‘4’] = ‘bar’自动转化
    • 复制对象:
      1. 浅拷贝: Object.assign()
      2. 深拷贝:JSON.parse( JSON.stringify( obj) )
    • 属性描述: Object.defineProperty 密封:seal 冻结: freeze
    • 获取设置:底层: [[get]] [[put]] 隐式: getter setter 显示:get set

    四. 混合对象‘类’

    类是一种设计模式
    1. 多重继承
    2. 混入 浅拷贝 Object.assign()
    3. 显示伪多态: Obj.bar.call(this, …)
    注意点: 显示混入只能复制对象的引用,无法复制对象和函数本身

为减少 js 关键词的占用,此文件只占用“c$”一个关键词; * 使用时用: c$.函数名(参数列表); 或者 c$().函数名(参数列表) * 字符串操作函数、日期操作函数、数组操作函数等,直接增加到 String、Date、Array 类里面,便于直接使用 */ /** * 获取元素,或者在DOM加载完成时执行某函数 * @param arg 此参数为字符串时,认为是 c$.getElement 的缩写,用来获取元素。用法参考 c$.getElement * 如果 arg 是 function 则认为是 c$.ready 的缩写,在dom加载完成时执行。没有此参数则返回 c$ 对象。 * @param dom 需要选择的DOM对象,默认是 window.document * @return 没有arg参数时返回 c$ 对象,arg参数是字符串时返回查询的元素,arg参数是函数时没有返回内容。 * * @example * c$("mytext") // 返回 id 或者 name 为"mytext"的元素 * c$("#mytext") // 返回 id 为"mytext"的元素 * c$("@mytext") // 返回 name 为"mytext"的所有元素 * c$(".class1") // 返回 class 为"class1"的所有元素 * c$("$div") // 返回 标签 为"div"的所有元素 * c$("$div #text1") // 返回 div 标签里面 id 为"text1"的元素(支持多级查询,以空格分隔) * c$(function(){alert('执行DOM加载完成事件');}); // 为 c$.ready(fun) 的缩写 * * c$.函数名(参数列表) // 调用这工具类里面的函数 * c$().函数名(参数列表) // 调用这工具类里面的函数 */ var c$ = window.c$ = function(arg, dom) { // 如果没有参数,则返回 本对象;让程序可以这样写: c$().函数名(参数列表) if (arguments.length === 0) return c$; if (typeof arg == 'function') return c$.ready(arg); // 有参数则调用获取元素的函数,为 c$.getElement 的缩写 return c$.getElement(arg, dom); }; /** * 这是错误调试程序 * 当页面发生错误时,提示错误讯息;仅测试环境里会提示,正式环境下不提示错误。 * 注意:chrome、opera 和 safari 浏览器不支持 onerror 事件 * @param msg 出错讯息 * @param url 出错档案的地址 * @param sLine 发生错误的行 * @return true 返回true,会消去 IE下那个恼人的“网页上有错误”的提示 */ window.onerror = function(msg, url, sLine) { // 测试时可以提示出错信息;正式发布时不提示 if (c$.isTest) { var errorMsg = "当前页面的javascript发生错误.\n\n"; errorMsg += "错误: " + msg + "\n"; errorMsg += "URL: " + url + "\n"; errorMsg += "行: " + sLine + "\n\n"; errorMsg += "点击“确定”消去此错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值