深入理解JavaScript | 青训营笔记

82 阅读2分钟

张琪老师

js的基本概念

js的发展历程

  • 1997年6月,发布第一版ECMAScript
  • 2009年12月Ryan创建Node.js
  • 2015年6月,发布ES6
    点击进一步了解

js的数据类型

复杂的数据类型:数组,对象、正则,都是复杂数据类型。 简单是数据类型;字符串、数字、布尔值等等。 使用const关键字,简单数据类型是不能被改变的,而复杂的数据可以被改变,看下面的一个例子:

const arr =[1,2]
arr.push(3);
const str = 'strstrstr';
str.slice(0,2);
console.log(arr,str);
//结果是:[1,2,3] strstrstr

js的作用域

区分词法作用域和词法环境。

let和var的区别:var有变量提升,在定义进行输出,结果为undefined,而不会报错。

函数也有变量提升,而且是整个函数内容均呈现

js是怎么执行的

执行上下文

当js引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前准备工作,这个准备工作,就叫做“执行上下文(execution context)”,也叫执行环境。 js当中的执行上下文包括全局执行上下文、函数执行上下文、Eval执行上下文

全局执行上下文

在代码开始执行时创建,并且压在栈底,在每个生命周期只执行一次。

函数执行上下文

当执行一个函数时,函数内部的代码会被编译,生成词法环境、变量环境等。当函数执行结束时从栈顶弹出。

高级、进阶js

闭包

function showName(){
    const name='张三';
    const age=23;
    console.log('name');
    return function (){
        console.log(age);
        return name;
    }


};
const ageName=showName();
console.log(ageName());

代码执行结果如下:

截屏2023-04-29 18.54.18.png 可以看到,当showName函数执行时,输出了字符串"naem",返回一个函数,该函数赋值给ageName,此时showName的执行上下文在函数执行结束时在栈顶弹出了,与之相关的内存也被回收。下一行则执行ageName函数,竟然将age、name这本该被回收的环境变量又用起来;那就是因为闭包,在return 的那个函数中,用到的变量会被打包,跟随函数,传给下一个接收者,就如上面的ageName。

this

普通函数的this指向window。

function printThis(){
console.log(this);
}
printThis();

结果如下 截屏2023-04-29 19.22.34.png 因为在node上运行,所以this指向的是global,在浏览器上则是window。

对象调用this指向该对象,也可以通过call或者aplay对this进行更改。