一、闭包
闭包(closure):闭包是一种代码形式,内部函数访问外部函数的局部变量。
在JS中,每当创建一个函数,闭包就会在函数创建的同时被创建出来,作为函数内部与外部连接起来的一座桥梁。
举例:js函数A里面有一个函数B,函数B访问了函数A里面定义的局部变量,此时就产生了闭包。
变量所在的函数就是闭包函数,这里A就是闭包函数。
作用1:解决变量污染问题,让变量被函数保护起来。
作用2:提供了有限的访问权限
// 外部函数
function f1(){
// 外部函数中的变量
let a = 10;
// 内部函数
function f2(){
// 内部函数访问外部函数的局部变量
console.log(a);
}
// 将内部函数return出去,这样外部才能调用到
return f2;
}
let fn =f1();
console.log(fn);
fn();
二、编写结构化程序
模块化概念:
把一个大的程序拆分成相互依赖的n个小文件,这些小文件还可以通过特定的语法组合到一起
优点:
- 避免命名冲突(减少命名空间污染)
- 更好的分离,按需加载
- 更高复用性
- 高可维护性
// 在require.js中,使用require.js提供的函数require()来应用一个模块
require(['模块文件的路径(不带.js后缀)',function(){}
//模块加载成功之后的回调函数
])
// CMD(Common Module Definition):公共模块定义规范。
// CMD是另一种JS模块化方案,它与AMD很类似。
// 不同点在于:AMD推崇依赖前置、提前执行:CMD推崇依赖就近,延迟执行。
//CMD主要通过sea.js实现此规范。// 目前看到的很少,很少,了解即可。
// 使用define函数,传入的一般是一个函数,这个函数接受三个参数,分别是require、exports、module。
define(function(require,exports,module){
const a = require('a')//同步导入
const b = require.async('b',function(b){
console.log(b);
})
//异步导入
})
三、变量
JS三种作用域
- 全局作用域(全局变量):在函数外面let的变量
- 局部作用域(局部变量):在函数里面let变量
- 块级作用域(块级变量):在分支或循环大括号中let的变量
全局对象:
(1)global表示Node所在的全局环境,类似于浏览器中的window对象
(2)process表示当前的进程,它是内置的一个process模块
(3)console表示标准输入输出,它是内置的一个console模块
全局函数:
(1)require用于加载模块
(2)四个和定时器有关的。setTimeout()、clearTimeout()、setInterval()、clearInterval()
四、定时器
【setTimeout和setInterval的区别】
timeout:暂停;超时;
interval:间隔;间隙。
使用setTimeout()开启的定时器,“时间”一到代码就会执行, 即用来指定某个函数或某段代码在多少毫秒之后执行。
使用setInterval()开启的定时器,“时间间隔”一到代码就会执行一次,即每隔一段时间执行一个函数。
setInterval(function(){
console.log(6);
},2000)//毫秒
setTimeout(function(){
console.log(77);
},5000)//执行后立刻停止,不再执行
// 使用clearTimeout()和clearInterval()可以清除定时器。
五、promise函数
promise是node.js的对象,它是一个构造函数,作用是将异步操作以同步操作的流程表达出来。解决Node.js异步编程中回调地狱的问题
promise链式写法:
// 导入fs模块 filesystem文件系统模块
const fs = require('fs')
const ps = new Promise((resolve, reject) => {
fs.readFile("../1.txt", (err, data) => {
if (!err) {
resolve(data)
}
else {
reject(err)
}
})
})
ps
// 当代码成功运行,执行.then里的函数
.then(resolve => {
console.log('读取到的内容是' + resolve);
return '你好'
})
.then(resolve => {
console.log('读取到的内容是' + resolve);
return '不好'
})
.then(resolve => {
console.log('读取到的内容是' + resolve);
})
// 当代码运行失败,执行.catch里的函数
.catch(err => {
console.log('出错了' + err);
})
// .then拿到的参数时上一个 .then中return的内容
// 如果上一个。then没有retuen 那么下一个 .then中的参数就是underfined
六、set方法
set与数组类似,但成员值都是唯一的,没有重复的值,常用语数组查重
// Set函数可以接收一个数组作为参数,用来初始化
const s = new Set([12,34,24,24,6])
console.log(s);
// 删除后数组s长度
console.log(s.size);
七、this关键字
this是一个使用在作用域内部(块级作用域、函数作用域、全局作用域)的关键字。this关键字是函数运行时自动生成的一个内部对象,只能在函数内部使用,总指向调用它的对象。(全局很少使用,大部分在函数内部使用。)
【this指向】
根据运行时的不同,this指向的对象有所区别。
在绝大多数情况下,函数的调用方式决定了this的值。
浏览器环境/全局环境下使用this:this指向window对象。
// 在函数中使用this:
// 不管函数怎么定义,不管函数在哪定义,只看函数的调用(箭头函数除外)。
// 普通函数(直接调用/全局调用):this指向window// 函数名()
function fn() {
console.log(this)
}; //Window}
fn();
//普通调用,this指向window
// 定时器函数:this指向window
// setTimeout(function(){},0)
// setInterval(function(){},0)
setTimeout(fn,0)
//把fn函数当作定时器处理函数使用
// 自执行函数:this指向window
// (function(){})()
// 以上都是全局函数,this指向window。