《JavaScript高级程序设计》读书笔记-第四章(变量、作用

2019-06-19  本文已影响0人  极奏

基本类型和引用类型

function setName(obj){
  obj.name = 'Nicholas'
  obj = new Object()
  obj.name = 'Greg'
}
var person = new Object()
setName(person)
console.log(person.name)  //'Nicholas'

说明即使在函数内修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数内部重写obj时,这个变量利用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。

总结:说明了变量是按值传递的,而不是按引用传递的。

检测类型

typeof

注意 :

typeof null = object
person instanceof Object      //变量perison是Object吗
colors instanceof Array      //变量colors是Array吗
pattern instanceof RegExp    //变量pattern是RegExp吗

执行环境及作用域

执行环境
作用域链
延长作用域链

执行流进入下列任何一个语句时,作用域链就会得到加长

没有块级作用域
垃圾收集
function problem(){
  var objectA = new Object()
  var objcetB = new Object()

  objectA.object = objectB
  objectB.anotherObject = objectA
}

IE中又一部分的对象并不是原生JavaScript对象,其BOM和DOM中的对象就是使用C++以COM(Component Object Model,组件对象模型),而COM对象的垃圾收集机制采用的就是引用计数策略,就会存在循环引用的问题

var element = document.getElementById('some_element')
var myObject = new Object()
myObject.element = element
element.someObject = myObject

即使例子中的DOM从页面中移除,它也永远不会被回收

避免类似的循环引用问题,最好是在不使用他们的时候手工断开连接

myObject.element = null
element.someObject = null

为了解决上述问题,IE9把BOM和DOM对象转换成了真正的JavaScript对象。这样就避免了两种垃圾收集算法并存导致的问题,也消除了常见的内存泄漏现象。

性能问题
管理内存

浏览器的可用内存数量通常要比分配给桌面应用程序的少。这样做的目的主要出于安全方面的考虑,目的是防止运行JavaScript的网页耗尽全部系统内存而导致系统崩溃。

function createPerson(name){
  var localPerson = new Object()
  localPerson.name = name
  return localPerson
}
var globalPerson = createPerson('Nicholas')

//解除
globalPerson = null
上一篇 下一篇

猜你喜欢

热点阅读