JavaScript之作用域与闭包总结

时间:2024-01-07 09:09:56

博主最开始接触程序是C语言,C++,后来是java,现在是php,无论哪一种语言与javascript在机制上都还是有比较大的区别。

下面总结一下用面向对象的思想写javascript需要区分的要点:

  1. 在JS中任何位置,没有使用var关键字声明的变量都是全局变量。
  2. 动态作用域在执行时确定,其生存周期到代码片段执行为止。动态变量存在于动态作用域中,任何给定的绑定的值,在确定调用其函数之前,都是不可知的。
  3. 在JavaScript里并没有块级作用域,也就是说在for、if、while等语句内部的声明的变量与在外部声明是一样的,在这些语句外部也可以访问和修改这些变量的值。
  4. 闭包就是一个函数,捕获作用域内的外部绑定。这些绑定是为之后使用而被绑定,即使作用域已经销毁。
  5. 如果一个函数内部有其他函数,那么这些内部函数可以访问在这个外部函数中声明的变量(这些变量就称之为*变量)。
  6. *变量可以被内部函数捕获,从高阶函数(返回另一个函数的函数称为高阶函数)中return语句实现“越狱”,以供以后使用。
  7. 当外部函数执行完毕后,外部函数虽然其执行环境已经销毁,但闭包依然保留着对其中变量绑定的引用,仍然驻留在内存之中。当外部函数执行完毕之后,才会执行内部函数,而这时内部函数捕获的变量绑定已经是外部函数执行之后的最终变量值了。
  8. 变量的捕获发生在创建闭包的时候。
  9. 自执行函数执行完毕之后,自执行函数作用域和PRIVATE属性随之销毁,但PRIVATE仍滞留在内存中,也就是加入到对象的作用域链中,闭包也就完成了变量的捕获。
  10. 匿名自执行函数,函数只需要执行一次,其内部变量无需维护,在执行完后内部变量很快就会被释放,这种机制不会污染全局对象。
  11. 闭包不会释放外部的引用,函数内部的值可以做缓存。
  12. 词法作用域(lexically scoped),函数运行在定义它的作用域中,而不是在调用它的作用域中。
  13. JavaScript是单线程的编程,同一时间JavaScript只能执行一段代码,如果这段代码要执行很长时间,那么之后的代码只能等待它执行完才能执行。
  14. 原型对象上的所有属性和方法,都会被对象实例所共享。
  15. 通过构造函数生成对象实例时,会将对象实例的原型指向构造函数的prototype属性。每一个构造函数都有一个prototype属性,这个属性就是对象实例的原型对象。