深入理解js
一、js的基本概念
(1)js的产生
1.JavaScript由美国人Brendan.Eich所发明
2.借鉴C语言的基本语法
3.借鉴Java语言的数据类型和内存管理
4.借鉴Scheme语言,将函数提升到"第一等公民" (first class)的地位
5.借鉴Self语言,使用基于原型(prototype) 的继承机制
(2)js的发展历程
1.1995年,布兰登·艾奇(Brendan Eich)在Netscape Navigator浏览器上创建了JavaScript。
2.1997年,ECMAScript标准诞生,定义了JavaScript的基本语法和对象模型。
3.2005年,Ajax技术的出现使得JavaScript变得更加流行,并引发了Web应用程序的革命。
4.2009年,Node.js的发布使得JavaScript开始进入服务器端开发领域。
5.2015年,ECMAScript 6 (ES6)发布,引入了一系列新的语言特性和改进,如箭头函数、类和模块。
6.目前,JavaScript已经成为全球最流行的编程语言之一,在Web开发、移动端开发、桌面应用程序开发等领域都有广泛的应用。
(3)js的基本组成
1.ECMAScript,描述了该语言的语法和基本对象。
2.文档对象模型(DOM),描述处理网页内容的方法和接口。
3.浏览器对象模型,描述与浏览器进行交互的方法和接口。
(4)js的特点
1.单线程 2.动态、弱类型 3.面向对象、函数式 4.解释类语言、JIT 5.安全、性能差 6......
(5)js中的基本数据类型
分为对象和基础类型,详细分类如下图所示:
(6)js中的作用域
作用域:一个变量在程序中可以使用的范围
在 js 中作用域的边界是以函数划分。有 全局 和 局部 作用域之分。
- 全局作用域:声明在全局的变量或者不使用var声明的变量在整个程序中都是可用的,所以叫全局作用域。
- 函数作用域:声明在函数体内的变量,在整个函数执行环境和其子函数内都是可用的,但是在函数外访问不到,所以叫局部作用域
(7)js中的变量提升
变量提升,mdn给出如下定义:
变量提升(Hoisting)被认为是, Javascript中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。在 ECMAScript® 2015 Language Specification 之前的JavaScript文档中找不到变量提升(Hoisting)这个词。
从概念的字面意义上说,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。
结合mdn给出的定义,通俗来讲,变量提升是指在 JavaScript 代码执行过程中,JavaScript 引擎把变量的声明部分和函数的声明部分提升到代码开头的行为。变量被提升后,会给变量设置默认值为 undefined
有如下示意图:
二、js是如何执行的
总的来说,代码的执行过程是由高级语言代码-->二进制机器码的过程。在这个过程中,涉及到了此法分析、语法分析、代码优化等一系列操作。有如下运行流程:
当JS引擎解析到可执行代码片段. (通常是函数调用)的时候,就会先做- -些执行前的准备工作,这个准备工作,就叫做"执行上下文( execution context简称EC )'',也叫执行环境
●全局执行上下文:代码开始执行时就会创建, 将他压执行栈的栈底,每个生命周期内只有一份 ●函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出
三、js进阶知识点
(1)闭包
闭包,mdn给出如下定义:
闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建
function init() {
var name = "Mozilla"; // name 是一个被 init 创建的局部变量
function displayName() { // displayName() 是内部函数,一个闭包
alert(name); // 使用了父函数中声明的变量
}
displayName();
}
init();
(2)this
this关键字,遵循谁调用指向谁的原则。