I JavaScript 高级用法
1/2

I 原型相关
I.I prototype
prototype
I.II __proto__
__proto__
__proto__
指向原型对象的prototype
总结⬆️:
原型对象的
prototype
=== 示例对象的__proto__
实例对象的
constructor/__proto__.constructor
指向 原型对象
II 作用域相关
II.I 词法作用域 -- 定义 时确定
II.II 动态作用域 -- 运行时确定
II.III 执行上下文
// demo
var foo = function () {
console.log("🚀 ~ file: 1203day01.md ~ line 33 ~ foo ~ 1", 1);
}
foo();
var foo = function () {
console.log("🚀 ~ file: 1203day01.md ~ line 37 ~ foo ~ 2", 2);
}
foo();
function foo () {
console.log("🚀 ~ file: 1203day01.md ~ line 41 ~ foo ~ 3", 3);
}
foo();
function foo () {
console.log("🚀 ~ file: 1203day01.md ~ line 45 ~ foo ~ 4", 4);
}
foo();
// output ⬇️
1
2
2
2
/**
* 解释 ⬇️
* var function 均会变量提升
* function 的提升会优先于 var 变量声明
* 所以最终实际的运行过程如下面代码
*/
function foo () {
console.log("🚀 ~ file: 1203day01.md ~ line 41 ~ foo ~ 3", 3);
}
function foo () {
console.log("🚀 ~ file: 1203day01.md ~ line 45 ~ foo ~ 4", 4);
}
var foo = function () {
console.log("🚀 ~ file: 1203day01.md ~ line 33 ~ foo ~ 1", 1);
}
foo();
var foo = function () {
console.log("🚀 ~ file: 1203day01.md ~ line 37 ~ foo ~ 2", 2);
}
foo();
foo();
foo();
II.IV 执行上下文栈
// 不知所云云。。。
II.V 变量对象?????
JavaScript
执行代码会创建执行上下文。 其包含如下三个属性:
变量对象(上下文相关联的作用域)
作用域链
this
变量对象 是与执行上下文相关的数据作用域,存储上下文中定义的变量和函数声明。
变量对象 又可细分为如下两点。
II.VI 全局上下文变量
全局对象,window / global
II.VII 函数上下文变量
activation object
-- AO
活动对象。
个人理解: 活动对象是变量对象的可访问的版本。
TIPS: 变量对象是规范或引擎上实现的,是不能在
JavaScript
环境中访问的。只有进入执行上下文,这个执行上下文中的变量对象才会被激活并可以被访问使用,而被激活后的变量对象也就称之为 活动对象 --AO
II.VII this
this
this
获取步骤:
将
MemberExpression
计算结果赋值给ref
判断
ref
是否是一个Reference
ref
是一个Reference
IsPropertyReference(ref)
结果为true
时,this
即为GetBase(ref)
否则判断
base value
值是否为Environment Record
是则为ImplicitThisValue(ref)
ref
不是一个Reference
this
值为undefined
看到这里发现有这些未知的名词
MemberExpression这里就
简单理解()左边的部分吧。
Reference
GetBase
base value
Environment Record
ImplicitThisValue
闭包
指能够访问自由变量的函数。
自由变量 指在函数中使用,但不是函数参数,也不是函数局部变量的一种变量。
TIPS 💡
最后更新于
这有帮助吗?