JS概念
JavaScript是一种高级编程语言,通常用于Web开发。它是一种解释性语言,意味着代码在运行时被解释器逐行执行,而不是在编译时被转换为机器代码。
JavaScript最初由Brendan Eich在1995年创建,最初被称为Mocha,然后更名为LiveScript,最终被命名为JavaScript。它最初是为Netscape Navigator浏览器创建的,旨在为网页添加交互性和动态性。
JavaScript最初的设计目标是简单易学,因此它采用了类似于C和Java的语法。它还具有动态类型、函数作为一等公民和原型继承等特性。
JavaScript具有以下特点:
- 单线程
- 动态、弱类型
- 面向对象、函数式
- 解释类语言、JIT
- 安全、性能差
JavaScript的数据类型分为两种,一种为对象,可以细分为数组、对象、函数等,另一种为基础类型,有七种,分别为:
- 数字(Number):表示数字,包括整数和浮点数。
- 字符串(String):表示文本,使用单引号或双引号括起来。
- 布尔值(Boolean):表示真或假。
- 空(Null):表示没有值。
- 未定义(Undefined):表示未定义的值。
- 对象(Object):表示复杂的数据结构,可以包含多个键值对。
- 符号(Symbol):表示唯一的标识符。
作用域
作用域指的是变量的可访问性和可见性。
JavaScript中有两种作用域:全局作用域和局部作用域。全局作用域中定义的变量可以在代码的任何位置访问,而局部作用域中定义的变量只能在其定义的代码块中访问。使用var声明的变量具有函数作用域,这意味着它们只能在声明它们的函数中访问。使用let或const声明的变量具有块级作用域,这意味着它们只能在声明它们的代码块中访问。
变量提升
在JavaScript中,存在着变量的作用域提升,以下是几种提升的情况:
- 使用var
- function先定义再调用
JavaScript是怎么执行
JavaScript中的执行上下文是指在代码执行期间,JavaScript引擎创建的一个内部数据结构(类似栈),用于存储代码执行期间的所有变量和函数。每个执行上下文都有一个与之关联的变量环境,用于存储变量和函数声明。JavaScript中有三种类型的执行上下文:全局执行上下文、函数执行上下文和eval执行上下文。
全局执行上下文是在代码执行之前创建的,它包含了所有全局变量和函数声明,每一个生命周期只有一份。函数执行上下文是在函数被调用时创建的,它包含了函数的参数、局部变量和函数声明。eval执行上下文是在eval函数被调用时创建的,它包含了eval函数中的变量和函数声明。
创建执行上下文的时候做了什么?
- 绑定this
- 创建词法环境
- 创建变量环境
词法环境是在代码编写期间创建的,它与变量和函数声明的作用域相关。每个词法环境都有一个关联的变量环境,用于存储变量和函数声明。在函数被定义时,它的词法环境就已经确定了,它包含了函数定义时所在的作用域链。当函数被调用时,JavaScript引擎会创建一个新的函数执行上下文,并将其关联的词法环境添加到作用域链中。
语法环境是在代码执行期间创建的,它与变量和函数的值相关。每个语法环境都有一个关联的变量环境,用于存储变量和函数的值。在函数被调用时,JavaScript引擎会创建一个新的函数执行上下文,并将其关联的语法环境添加到作用域链中。在函数执行期间,JavaScript引擎会根据作用域链查找变量和函数的值。
进阶知识点
JavaScript进阶知识点有很多,这里仅讨论一部分。
闭包
闭包是指一个函数可以访问其定义时所在的词法环境中的变量,即使该函数在定义时所在的词法环境已经销毁。这是因为JavaScript引擎会在函数被定义时创建一个闭包,将函数和其所在的词法环境绑定在一起。当函数被调用时,闭包会被激活,并将其所在的词法环境添加到作用域链中,使得函数可以访问其定义时所在的词法环境中的变量。
function makeCounter() {
var count = 0;
return function() {
count++;
console.log(count);
};
}
var counter1 = makeCounter();
var counter2 = makeCounter();
counter1(); // 输出1
counter1(); // 输出2
counter2(); // 输出1
counter2(); // 输出2
this
普通函数的this指向window,对象调用指向对象。