由于每个人对同样东西,往往有着不同的见解,而且,每个人表达的方式也有所不同。那么,对于描述同样东西,知识概念的时候,就容易产生歧义。又由于受众的认知程度不同,接收的信息也有高低之别,那么,理解同样的东西的不同表述,就更加千变万化。
javasctipt(代码的执行顺序)
下边的知识点,围绕的问题就是支撑js代码执行顺序的依据。
作用域
作用域:执行上下文,可以理解成变量的生命周期。严谨地说是变量被合法访问的范围。
闭包
闭包前置知识还有 绑定 作用域 调用栈 等,而闭包本质上来讲是函数。
const sayLater = function(text,when)=>{
let task = ()=> console.log(text)
setTimeout(task,when)
}
- 闭包是指有权访问另外一个函数作用域中的变量的函数。—《Javasc高级程序设计》
- 带有自由变量(即代码中使用但没声明为参数或局部变量的变量)的函数是闭包—《不知道的javastript..》
- 当函数可以记住并访问所在的词法作用域时,就产生闭包,即使函数是在当前词法作用域之外执行—《写给大忙人的现代JavaScript》
- ...每次调用都会重新创建局部绑定的事实,并且不同的调用不能在其他调用的局部绑定上进行操作。这个能够引用封闭作用域中的局部绑定的特定实例的功能称为闭包。(《JavaScript编程精讲》太长截图吧)
......
闭包的使用场景:
- 缓存数据,向外只提供接口访问
- 固定对象(原理同上:保存对象状态为私有的,即除通过提供的方法外,没有人可以修改它)
const createAccount = (balance)=>{
return Object.freeze({
deposit:amout=>{
blance+=amout
},
...
})
}
//工程函数
//状态被自动封装;避免使用this参数
//上图中的闭包 也可以是 函数柯里化
function test(other){
return number => number+other;
}
const vaule = test(2);
console.log(test(3)) // 5
this
this对象是在运行时基于函数的执行环境绑定的。
作用域 闭包 this的相关描叙
- 作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象
- 一般来讲,当函数 执行完毕后,局部活动对象就会被销毁,内存中仅保存全局作用域(全局执行环境的变量对象),但是闭包的情况又有所不同。
...