原型链和作用域链的理解
// 什么是作用域链:
// 作用域链是针对变量的,比如我们一个函数1里面嵌套了另一个函数2,那么此时就有了三个作用域:全局作用域--->函数1作用域--->函数2作用域
// ,那么函数2会先在自己的作用域内查找相关变量,如果没有就会向上级作用域查找,这个查找过程就是作用域链
// 例子1:
1 var a = 100 2 function f1(){ 3 a = 10 4 function f2(){ 5 a = 1 6 console.log(a); 7 } 8 f2() 9 } 10 f1()
// 例子1 最后打印出来的结果是 1 ,因为f2函数在自己的作用域内已经找到了变量a,所以不会继续向上查找
// 那什么又是原型链呢?
// 原型链是针对构造函数而言,当我们创建了一个函数obj,通过一个变量new出来一个新的函数f3,那么这个新函数就继承了obj函数的一些属性
// 当我们在新函数中用到一个没有定义的变量时,它会向原函数obj中去查找这个变量
// 例子2:
1 function obj(){ 2 this.name = '陈斌', 3 this.age = 25 4 obj.prototype.sex = '男' 5 } 6 let f3 = new obj() 7 f3.salary = 6000 8 console.log(f3.name); 9 console.log(f3.sex); 10 console.log(f3.salary); 11 console.log(f3.c); 12
// 例子2 输出结果分别是:陈斌 男 6000 undefined
// name,age,sex 都是obj函数的属性,salary是给新函数f3添加的属性,但是当我们在f3中用到了没有定义的变量,它会自动向它的父级函数查找
// 当父级函数也没有这个变量,就会返回一个undefined