目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、作用域(可拓展)
作用域决定了变量、函数和对象在代码中的可访问性。JavaScript中的作用域分为以下几种:
- 全局作用域
- 函数作用域
- 块级作用域
- 词法作用域
- 模块作用域
- 动态作用域
- 作用域链
二、闭包
1.闭包(Closure)
是指一个函数能够访问并记住其词法作用域(Lexical Scope),即使这个函数在其词法作用域之外执行。闭包是 JavaScript 中非常强大的特性,它允许函数“记住”并访问定义时的环境,即使这个环境已经不再存在。
const foo = ()=>{ var arr=[]; var i; for (i=0;i<10;i++){ arr[i]=function In(){ console.log(i); } } return arr[0]; }
在这个代码中,由于内部函数In调用外部变量i 即使foo函数执行完毕,var i 仍会被In记住,此时In就形成了一个闭包
2.闭包的使用场景
-当使用FP的时候基本就会使用闭包
-当一个函数执行,和上下文相关,就有闭包
-闭包是用来保存执行环境的,也包括环境内的变量
3.闭包的实际应用(可拓展)
3.1.1 数据封装
3.1.2 回调函数
3.1.3 函数柯里化
3.1.4 模块模式
4.闭包的缺陷
影响性能:过度使用闭包尤其是循环创建会降低性能
内存泄漏:闭包会导致其词法作用域中的变量无法被垃圾回收,从而可能导致内存泄漏
三.this
非严格模式this
普通函数被调用时,因为全局的方法和属性都是
window
对象的方法和属性,所以this指向全局对象(浏览器中的window),严格模式下,this的值是undefined。函数调用对象this
当函数作为对象的方法调用时,this指向该对象。
当函数作为构造函数调用时,this指向新创建的对象。(函数通过new关键字调用,this指向新创建的实例对象)
箭头函数中的this
首先,箭头函数没有自己的this,全局作用域下,箭头函数的this指向全局对象,而在对象的方法中使用箭头函数时,this指向定义箭头函数时所在上下文的this值。
事件处理函数中的this
在DOM事件处理函数中,this默认指向触发事件的DOM元素。
显式绑定thiscall,apply,bind可以显式的绑定this指向特定对象。
四.面向过程和面向对象
1.JS对象的创建
//JS对象的创建 Object.create(); var bar = {}; new 关键字; //三者的区别
Object.create()创建了一个对象 let p = Object.create(q) ; // ->p._proto_===q;
p的原型指向q; //原型链
当需要调用p对象的一个方法或属性时,如果p上没有则去q
总结
变量提升,函数提升
Js本身没有类,Js万物皆对象
this 是动态绑定的,取决于函数调用的上下文。
普通函数调用时,this 指向全局对象(非严格模式)或 undefined(严格模式)。
对象方法调用时,this 指向该对象。
构造函数调用时,this 指向新创建的实例。
箭头函数没有自己的 this,它会继承外部函数的 this。
显式绑定:通过 call()、apply() 或 bind() 可以显式设置 this。
理解 this 的关键在于调用时的环境,它决定了 this 的指向。