一、做用域链 -- 要到建立这个函数的那个做用域中取值——是“建立”,而不是“调用”node
若是代码中只有声明没有赋值,显示 undefined闭包
若是既无声明也没赋值,就会报错函数
var a=10; function f1(){ var b=20; function f2(){ // 当前做用域没有此变量时,逐级往父做用域上面找 var c = 30; console.log(a) // 自由变量 console.log(b) // 自由变量 console.log(c) } f2() } f1()
二、闭包this
闭包的使用场景spa
一、函数做为返回值prototype
二、函数做为参数传递-----要到建立这个函数的那个做用域中取值——是“建立”,而不是“调用code
function F1() { var a = 10; //若是这条代码消失,a会取上一级做用域的值 console.log('b') return function () { console.log(a) // a 为自由变量 } } var f1 = F1(); var a = 20; // f1(); // 10 function F2(fn){ var a=30; // a不会取调用它的做用域的值 fn() } F2(f1) // 10
三、原型链对象
在访问对象的属性和方法时, 会在当前对象中查找, 若是没有找到, 会一直沿着原型链上的原型对象__proto__向上查找, 直到找到Object.prototype(原型的顶端)
为止,这就是原型链。blog
function Dog() { this.eat = function () { console.log('喜欢吃骨头') } } function Cat() { this.food = function () { console.log('喜欢吃鱼') } } Cat.prototype.weight=function(){ console.log('不重') } Dog.prototype = new Cat(); var dog = new Dog(); dog.eat() // 喜欢吃骨头 dog.food() // 喜欢吃鱼 dog.weight() // Cat的原型对象的方法会被继承下来