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)