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)