Javascript-基础概念总结(2)javascript
最近学习一些javascript基础知识,也解决了不少以前的疑惑,记得第一次被问及怎样理解闭包时,个人回答是:就是相似于封装吧!如今想一想是有多白痴,学习技术是须要逻辑性很强的,技术注重用事实和数听说话,每一点都须要理解透彻,在技术上没有猜想,没有套路,之后本身在回答技术性的问题时,应作到知道就是知道,不理解或不太明白的,就诚实对待,这样有助于本身积累知识,了解本身的不足,从而提高本身。讲了那么多题外话,是为了让本身认识到应真诚的对待学习。下面是一些个人知识总结:前端
【做用域】
javascript中的做用域能够理解为一个语句执行的环境大小,有全局的做用域,函数做用域和eval做用域。在JS中没有块级做用域。
讲到做用域,不得不讲执行环境,执行环境在JS中是最为重要的概念。执行环境定义了变量或函数有权访问的其余数据,决定了他们各自的行为。每一个执行环境都有一个与之关联的变量对象,环境中定义的全部变量和函数都保存在这个对象中。在web浏览器中全局环境被认为是window对象,某个执行环境中的全部代码执行完毕后就被该环境销毁,保存在其中的全部变量和函数定义也随即销毁。
每一个函数都有本身的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行以后,栈将其环境弹出,把控制权返回给以前的执行环境。
当代码在一个环境中执行时,会建立变量对象的一个做用域链。做用域链的用途是保证对执行环境有权访问的全部变量和函数的有序访问。做用域链的前端始终是当前执行的代码所在环境的变量对象。做用域链中的下一个变量对象来自包含(外部)环境,在下一个变量对象则来自于在下一个包含环境,这样一直延续到全局执行环境,全局执行环境的变量对象始终都是做用域链中的最后一个对象。
需注意的是:在局部做用域中定义的变量能够在全局环境和局部环境中交互使用。内部环境能够经过做用域链访问全部的外部环境,但外部环境不能够访问内部环境中的任何变量和函数。每一个环境均可以向上搜索做用域链,以查询变量和函数名,但任何环境都不能够经过向下搜索做用域链而进入另外一个执行环境。
做用域链本质上是一个指向变量对象的指针列表,他只引用但不包含变量对象。
【闭包】
闭包是指有权访问另外一个函数做用域中的变量的函数,这里要把它与匿名函数区分开(匿名函数:建立一个函数并将它赋值给一个变量,这种状况下建立的函数叫匿名函数,匿名函数的name属性是空字符串),建立闭包的常见方式就是在一个函数内部建立另外一个函数。闭包保存的是整个变量的对象。
闭包的做用:在函数执行过程当中,为读取和写入变量的值,就须要在做用域链中查找变量,这时灵活方便的闭包就派上用场,咱们知道当一个函数被调用时就会建立一个执行环境及相应的做用域链,那么闭包就会沿着做用域链获取到开发者想要的变量及元素。
注:在维基百科中是这样定义闭包的:闭包(也称词法闭包或函数闭包)是指一个函数或函数的引用,与一个引用环境绑定在一块儿。这个引用环境是一个存储该函数每一个非局部变量(也叫自由变量)的表。——闭包不一样于通常的函数,它容许一个函数在当即词法做用域外调用时,仍可访问非本地变量。
闭包灵活方便,也能够实现封装,这样就只能经过对象的特定方法才能访问到其属性。可是,不合理的使用闭包会形成空间的浪费,内存的泄露和性能消耗。
【原型和原型链】
讲到原型链,不得不讲讲用于建立对象的原型模式:咱们建立每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含能够由特定的全部实例共享的属性和方法。从字面意思理解,那么prototype就是经过调用构造函数而建立的那个对象实例的原型对象。使用原型对象的好处是可让全部对象实例共享它所包含的属性和方法。咱们能够经过对象实例访问保存在原型中的值,但却不能经过对象实例重写原型中的值。若是咱们在实例中添加了一个与原型实例中同名的属性,那么咱们在实例中建立该属性,该属性将会屏蔽原型中的属性。
不管何时,只要建立一个新函数,就会根据一组特定的规则为函数建立一个prototype(原型)属性,这个属性指向函数的原型对象。
原型链:用于实现JS中的实现继承。(许多语言都支持两种方式的继承:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。因为函数没有签名,在ECMAScriot中只能实现实现继承。
原型链做为实现继承的主要方法,其基本思想是利用原型让一个引用类型继承另外一个引用继承的属性和方法。了解一下构造函数、原型和实例的关系:每一个构造函数都是一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。假如咱们让原型对象等于另外一个类型的实例,那么此时的原型对象将包含一个指向另外一个原型的指针,相应的另外一个原型中包含着一个指向另外一个构造函数的指针。如此层层递进,就构成了实例与原型的链条。这就是原型链的概念。
当函数调用时,需查找和获取的变量和元素都会经过原型链机制一层层的往上搜索在原型对象或继承来的对象中得到。
java
当函数被建立,就有了做用域,当被调用时,就有了做用域链,当被继承时就有了原型链,当须要获取做用域链或原型链上的变量或值时,就有了闭包。web