生物学特色网站建设,宁波网站建设企业,随州王章欣,百度关键词排名代做作用域 变量的可用范围 作用域链 保存的变量的使用顺序的一个链#xff08;也就是路线图#xff09;#xff0c; 被称为作用域链。 当在Javascript中使用一个变量的时候#xff0c;首先Javascript引擎会尝试在当前作用域下去寻找该变量#xff0c;如果没找到#xff0c;再…
作用域 变量的可用范围 作用域链 保存的变量的使用顺序的一个链也就是路线图 被称为作用域链。 当在Javascript中使用一个变量的时候首先Javascript引擎会尝试在当前作用域下去寻找该变量如果没找到再到它的上层作用域寻找以此类推直到找到该变量或是已经到了全局作用域。 如果在全局作用域里仍然找不到该变量它就会在全局范围内隐式声明该变量(非严格模式下)或是直接报错。 词法环境 是一种标识符—变量映射的结构(这里的标识符指的是变量/函数的名字变量是对实际对象[包含函数和数组类型的对象]或基础数据类型的引用)。 简单地说词法环境是Javascript引擎用来存储变量和对象引用的地方。 闭包 能够读取其他函数内部变量的函数 。js里为了实现数据和方法私有化的方式。 1-实现模块化和私有变量 2-缓存数据 3-实现回调函数 面试原理之闭包的优缺点和应用场景 - 掘金 (juejin.cn) 闭包的缺点 内存泄漏由于闭包中的函数引用了外部函数的变量而外部函数的作用域在函数执行结束后并不会被销毁这就导致了闭包函数中的变量也无法被销毁从而占用了内存空间。如果闭包被滥用可能会导致内存泄漏的问题。性能问题闭包中的函数访问外部函数的变量需要通过作用域链来查找而作用域链的长度决定了查找的速度。如果闭包层数较深作用域链就会很长从而影响了函数的执行效率。 为了解决闭包的这些问题可以采取以下一些措施 及时释放闭包如果不再需要使用闭包可以手动将其赋值为 null从而释放闭包中占用的内存空间。减少闭包层数尽量减少闭包层数避免作用域链过长从而提高函数的执行效率。使用立即执行函数可以使用立即执行函数来避免闭包的内存泄漏问题。由于立即执行函数在执行结束后会被立即销毁因此其中的变量也会被释放。使用模块化编程可以使用模块化编程来避免闭包的性能问题。在模块化编程中每个模块都是一个独立的作用域不会对全局作用域造成影响从而避免了作用域链过长的问题。 // 构造函数
function Person(name, age) {this.name name;this.age age;
}// 生成实例
const p new Person(zhangsan, 18);
new()方法做了什么 创建一个新对象 将新对象的__proto__指向构造函数的protptype对象 将构造函数的作用域赋值给新对象也就是this指向新对象 执行构造函数中的代码为这个新对象添加属性 返回新的对象 一文搞懂JS原型与原型链超详细建议收藏 - 掘金 (juejin.cn)
构造函数创建一个实例的过程 创建一个新对象将构造函数的作用域赋值给新对象这样this就指向了新对象执行构造函数中的代码为新对象添加实例属性和实例方法返回新对象 原型 每个函数都有prototype属性被称作原型。prototype原型指向一个对象故也称作原型对象。 原型对象 JS的每个函数在创建的时候都会生成一个属性prototype这个属性指向一个对象这个对象就是此函数的原型对象。该原型对象中有个属性为constructor指向该函数。这样原型对象和它的函数之间就产生了联系。 __proto__和prototype不太一样一个是对象拥有的隐式原型一个是函数拥有的显式原型这里我们简单总结一下__proto__ 通常被称作隐式原型每个对象都拥有该属性。[[prototype]]其实就是__proto__。 原型链 当访问一个对象的某个属性时会先在这个对象本身属性上查找如果没有找到则会通过它的__proto__隐式属性找到它的构造函数的原型对象如果还没有找到就会再在其构造函数的prototype的__proto__中查找这样一层一层向上查找就会形成一个链式结构我们称为原型链。 结论每个对象都有 __proto__ 属性但只有函数对象才有 prototype 属性
JavaScript原型与原型链最全面的详解 - 掘金 (juejin.cn)