首页 > 应用开发 > Javascript > JavaScript进阶教程日记
1. 预编译
1.1 全局对象(GO对象) window
js引擎会整合所有<script>标签中的内容, 产生window对象
全局变量: 全局对象的一个属性
全局函数: 全局对象的一个方法
1.2 局部对象AO/活动对象AO
函数被调用时产生,保存当前函数内部的执行环境。方法执行完后, 局部对象就消失
局部变量: 是局部对象的一个属性
局部函数: 是局部对象的一个方法
1.3 全局预编译
全局环境下(script标签下),js引擎的预处理方式
步骤
1. 生成GO对象(window对象)
2. 查找所有变量的声明,变量名作GO对象属性名,值为undefined
3. 查找所有函数的声明,函数名作GO对象属性名,属性值为function
同名的变量和函数,函数的优先级高
1.4 函数预编译
调用函数之前会做一个函数的预编译
步骤
1. 调用那一刻,为函数生成一个AO对象
2. 查找函数形参和局部变量的声明,作为AO属性名,值为undefined
3. 实参值赋给形参
4. 找到局部函数的声明,函数名作AO对象属性名,属性值为function
局部函数 > 实参 > 形参和局部变量
2. 作用域
2.1 全局作用域
script标签产生的区域,window对象管控的区域
全局的变量和函数浏览器关闭的时候销毁
2.2 局部作用域 function () { }
函数对象 管控区域
局部变量和函数 在函数执行完成后销毁
2.3 块级作用域 { let a = 1; }
if、for 管控的 {} 区域
let
2.4 作用域链
内部可以访问外部
使用数组存放,栈结构(上端进出,元素压栈进去,先产生的在下面)
本质
是一个数据结构,函数内部可以嵌套函数,每一次嵌套形成一个作用域,串起来就形成作用域链
每个函数内部都的【scopes】属性,代表函数的作用域链,代表函数执行时所存在的执行环境(含每个作用域中的变量、局部函数)
console.dir(a); //打印函数内部结构(含scopes属性)
分别代表:
0 bAO
1 aAO
2 GO
断点调试
2.5 变量取值原则
就近原则,当前作用域中没有 就找上一层,依次往上找,都没有就报错
3. 原型
实例成员 this添加的成员
静态成员 在构造函数本身上添加的成员,通过构造函数名访问
原型对象prototype: 构造函数的一个静态成员属性 Star.prototype
对象的原型: 对象的一个属性 ldh.__proto__
原型对象与对象的原型,指向同一个对象,都有一个属性constructor(指向构造函数本身)
原型链
概念
实例对象的__proto__属性,指向的构造函数的原型对象。
(也是一个对象,也有__proto__属性),再一层一层往上找就形成原型链
作用
1. 当实例对象调用方法,先在自身的this中的方法找
2. 没有的话,通过__proto_找原型对象,看原型对象里有无定义
3. 没有的话,通过原型对象的__proto__再到上一层
4. 一直找到object都没有,则报错
__proto__ 对象原型的存在,就是为对象成员的查找机制提供了一个方向
this指向
构造函数和原型对象中的this 都指向当前创建的对象
应用(为js数组Array扩展sum方法)
Array.prototype.sum = function(){
console.log(this); //this代表这个数组对象
var total = 0
for(var i=0; i<this.length; i++){//当前数组长度
total += this[i] //当前数组某个值
}
return total
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70001647/viewspace-2998766/ ,如需转载,请注明出处,否则将追究法律责任。