2.作用域
2021-08-13 10:04:42
登录查看完整内容
js作用域,ao、vo,this指向
举报
猜你喜欢
大纲/内容
js是静态
var value = 1;function foo() { console.log(value);}function bar() { var value = 2; foo();}bar();
foo定义在全局作用域,value局部找不到就往作用域上级全局找,是1
函数作用域在定义的位置确定
词法作用域
静态作用域
函数作用域在调用时确定
动态作用域
动态和静态作用域
初始化入上下文栈
应用程序结束出栈
globalContext
全局代码
执行函数创建函数上下文加入执行栈
执行完毕出栈
函数代码
但是eval('var b = 3')被执行。foo在运行的时候,eval对作用域的环境进行了修改
eval
通过with可以做到不需要重复的引用对象本身
输出{a\
with 可以将一个没有或者有多个属性的对象处理称为一个完全隔离的词法作用域,这个对象的属性会被定义称为在这个作用域中的词法标识符
with语法是根据你传递的对象,创建另一个全新的词法作用域
with
eval和with
欺骗词法
eval代码
进入上下文,再执行代码
执行顺序
可执行代码
执行上下文栈
全局上下文
进入函数时创建
通过函数的arguments初始化
函数上下文
AO = {}
AO.arguments = Arguments对象
arguments初始化
有实参,AO[形参key] = 形参value
无实参,属性值为undefined
形参
AO[函数名] = 该函数体
所以函数声明优于变量声明
变量对象已经存在相同名称的属性,则完全替换这个属性
函数声明
必须以var声明
AO已有同名属性,忽略
所以函数表达式不会提升
AO无同名属性,AO[变量名] = undefined
变量声明
function foo(a) { var b = 2; function c() {} var d = function() {}; b = 3;}foo(1);
示例
进入执行上下文时,代码未执行
代码执行阶段
通过上下文的VO找变量
当前VO,找不到遍历父级VO,找不到报错
找寻变量
function foo() { function bar() { ... }}
函数有一个内部属性 [[scope]]
作用域链(Scope chain)
指向的是那个调用它的对象
指向new出来的实例
无return
指向该对象
对象
非对象
return
new
this
RHS查询,找到变量,但是进行不合理的应用的时候,会抛出异常TypeError
RHS查询,如果找不到变量,会抛出异常ReferenceError
RHS
LHS查询,如果查询到全局作用域,都找不到变量,会很热心的声明一个变量,并返还给引擎
LHS
LHS和RHS
var scope = \"global scope\";function checkscope(){ var scope = \"local scope\"; function f(){ return scope; } return f;}checkscope()();
var scope = \"global scope\";function checkscope(){ var scope = \"local scope\"; function f(){ return scope; } return f();}checkscope();
执行上下文
globalContext入栈
checkscope functionContext入栈
checkscope functionContext出栈
f functionContext入栈
f functionContext出栈
globalContext出栈
以下面的例子为例,结合着之前讲的变量对象和执行上下文栈,我们来总结一下函数执行上下文中作用域链和变量对象的创建过程:var scope = \"global scope\
作用域
0 条评论
回复 删除
下一页