上下文

函数上下文(AO)

当进入执行上下文时,这时候还没有执行代码,

变量对象会包括:

函数的所有形参和声明变量 (如果是函数上下文)

1.由形参和声明变量的名称为属性被创建;

2.没有实参,属性值设为 undefined

实参赋值给形参

1.找到形参名称的属性,将其属性值由undefined改为实参值

函数声明

1.由名称和对应值(函数对象(function-object))组成一个变量对象的属性被创建

2.如果变量对象已经存在相同名称的属性,则完全替换这个属性

 

最后在执行函数

例子:

复制代码
function test(a){
    console.log(a);
    var a=1;
    console.log(a);
    function a(){}
    console.log(a);
    console.log(b);
    var b=function(){}
    console.log(b);
    function c(){}
}
test(2)

1.AO = {
    a: undefined,
    b: undefined,
}
2.AO = {
    a: undefined->
    2,
    b: undefined,
}
3.AO = {
    a: undefined ->
        2 ->
        function a(){},
    b: undefined,
    c: function c(){},
}
4.AO = {
    a: undefined ->
        2 ->
        function a(){}->
        1,
    b: undefined -> function b(){},
    c: function c(){},
}
复制代码

 

复制代码
function test(){
    return a;
    a=1;
    function a(){}
    var a=2;
}
console.log(test()); // function a(){}

AO={
    a:undefined -> function a(){}
}
复制代码

 

复制代码
console.log(test()); //2
function test() {
    a = 1;
    function a() { }
    var a = 2;
    return a;
}
AO = {
    a: undefined -> function a() { }->1->2
}
复制代码

 

复制代码
a=1;
function test(e){
    function e(){}
    arguments[0]=2;
    console.log(e); // 2
    if(a){
        var b=3;
    }
    var c;
    a=4;
    var a;
    console.log(b); // undefined
    f=5;
    console.log(c); // undefined
    console.log(a); // 4
}
var a;
test(1);
console.log(a); // 1
console.log(f); // 5

GO={
    a:undefined ->1,
    test:function test(){...},
    f:5
}
AO={
    e:undefined->1->function e(){}->2,
    b:undefined,
    c:undefined,
    a:undefined->4,
}
复制代码

 

复制代码
function foo() {
    console.log(a);
    a = 1;
}

foo(); // ???

function bar() {
    a = 1;
    console.log(a);
}
bar(); // ???
复制代码

第一段会报错:Uncaught ReferenceError: a is not defined

第二段会打印:1

这是因为函数中的 "a" 并没有通过 var 关键字声明,所有不会被存放在 AO 中。

a=1是执行阶段,不存在变量提升在GO里。

第一段执行 console 的时候, AO 的值是:

AO = {
    arguments: {
        length: 0
    }
}

没有 a 的值,然后就会到全局去找,全局也没有,所以会报错。

当第二段执行 console 的时候,全局对象已经被赋予了 a 属性,这时候就可以从全局找到 a 的值,所以会打印 1。

 

全局上下文(GO)

// 函数声明整体提升,变量只有声明提升,赋值是不提升的

var a=1;// 是有两个步骤的,一是声明变量,二是变量赋值;

test(); // 1
function test(){
  conslo.log(1);  
}
console.log(a); // undefined
var a; 

 

 思考,为啥执行的位置不一样;会产生这种变化变化?

复制代码
复制代码
function getName() {
    console.log(1);
}
var getName = function () {
    console.log(2);
}
getName(); // 2
var a=1;
function a(){
  console.log(2);
}
console.log(a); // 1
复制代码
复制代码

 

复制代码
复制代码
getName(); // 1
function getName() {
    console.log(1);
}
var getName = function () {
    console.log(2);
}

console.log(a); // 函数a
var a=1;
function a(){
  console.log(2);
}
复制代码
复制代码

 

函数里面没有声明的变量,都是在window下的,不管是多少层函数内;

// GO与AO类似,就是没有参数

 1.找变量;

2.找函数声明

2.执行

GO={
    a:undefined->function a(){}->1
}

posted on   sss大辉  阅读(411)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示