张琪老师
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());
代码执行结果如下:
可以看到,当showName函数执行时,输出了字符串"naem",返回一个函数,该函数赋值给ageName,此时showName的执行上下文在函数执行结束时在栈顶弹出了,与之相关的内存也被回收。下一行则执行ageName函数,竟然将age、name这本该被回收的环境变量又用起来;那就是因为闭包,在return 的那个函数中,用到的变量会被打包,跟随函数,传给下一个接收者,就如上面的ageName。
this
普通函数的this指向window。
function printThis(){
console.log(this);
}
printThis();
结果如下
因为在node上运行,所以this指向的是global,在浏览器上则是window。
对象调用this指向该对象,也可以通过call或者aplay对this进行更改。