作用域、闭包、原型

1.作用域

1) 全局作用域
2)函数作用域
3)块级作用域

// 最顶层作用域即为全局作用域 
function test() {
  if (true) {
    var a = 1
    let b = 2
  }
  console.log('a: ', a);  // 在函数里用var声明的变量都是局部变量
  console.log('b: ', b);  // 使用let声明的变量只在定义的代码块内有效
}

test()

总结: 作用域就是js访问变量的机制

2.闭包

在函数外能够访问函数内的变量
1)

var a = function outer() {
  var a = 2
  return function () {
    a ++
    return a
  }
}
var b = a()
b() // 3
b() // 4

2)作用及缺点
作用:
实现私有变量,减少全局变量
缺点:
耗费内存,容易导致内存泄漏

3. 原型

每一个函数都有一个prototype对象属性,指向另一个对象
prototype(对象属性)的所有属性和方法,都会被构造函数的实例继承
prototype就是调用构造函数所创建的那个实例对象的原型(proto)。


function Animal(animal) { 
  this.name = animal
}
Animal.prototype.getName = function() {
  return this.name
}
Animal.prototype.setName = function(name) {
  this.name = name
}
 // Animal 的prototype.constructor关联到Animal本身
console.log('Animal 的prototype.constructor关联到Animal本身: ',  Animal === Animal.prototype.constructor)
 // Animal  就是构造函数   a就是实例对象  
 // 每次创建对象的时候就将该对象的__proto__属性关联到构造函数的prototype属性
var a = new Animal('dog')
console.log(a)
console.log(a.getName())
console.log(a.__proto__ === Animal.prototype)

猜你喜欢

转载自www.cnblogs.com/coldfrost/p/11729272.html