预编译---

本文详细解析了JavaScript的作用域规则,包括函数声明提升和变量声明提升,以及预编译过程中的变量行为。通过实例演示,探讨了AO对象和全局对象(GO)的关系,以及在函数、全局变量和函数声明中的作用域变化。
摘要由CSDN通过智能技术生成

函数作用域初探

1.作用域定义:孙子最舒服。里面可以访问外面函数定义的变量,外面不可以访问里面函数定义的变量

2.js进行三部曲

一,预编译
函数声明整体提升,变量 声明提升。
(1)
// An highlighted block
function test(){
    console.log("a");
}
test();放在该代码前和代码后都可以执行成功
函数声明整体提升:函数整个声明全部放在前面,即function 这一堆全放在script标签后面
(2)
// An highlighted block
function test(){
    console.log(a);
}
var a=123;放在该代码前可以执行成功,放在该代码后结果为undefined(不报错)
变量 声明提升:变量声明放在前面,即var a放在script标签后面,复制不放。
预编译前奏
1.imply global暗示全局变量:即任何变量,如果未经声明就赋值,则此变量就为全局对象(window)所有。a=10 等价于window.a=10
2.一切声明的全局变量,全是window的属性。var a=10 等价于window.a=10
// An highlighted block
function test(){
    var b=123;
}
test();
console.log(window.b);
预编译过程(全局(GO==window)省去第三步)
// An highlighted block
function fn(a){
    console.log(a);
    var a=123;
    //预编译发生在函数执行的前一刻
    console.log(a);
    function a(){}
    console.log(a);
    var b=function(){}
    console.log(b);
    function d(){}
}
fn(1);
1.创建AO对象

AO{
}

2.找形参和变量声明的名,作为AO对象的属性名,值为undefined

AO{
a:undefined
//a写过就不用写了
b:undefined

}

3.将实参形参相统一

AO{
a:1
//a写过就不用写了
b:undefined

}

4.找函数声明

AO{
a:function a(){}
//a写过就不用写了
b:undefined
d:function d(){}
}
函数执行:
在这里插入图片描述
举例:

// An highlighted block
function test(a,b){
    console.log(a);
    c=0;
    var c;
    a=3;
    b=2;
    console.log(b);
    function b(){}
    function d(){}
    console.log(b);
}
test(1);

AO{
a:3
b:2
c:0
d:function d(){}
}
1 2 2
在这里插入图片描述
举例:
在这里插入图片描述

AO{
a:undefined 1 function a{} 123
b:undefined 234 234 function (){}
}
f undefined 234 123 123 f

AO和GO

举例:

// An highlighted block
console.log(test)
function test(){
    console.log(test);
    var test=234;
    console.log(test);
    function test(){}
}
test(1);
var test=123;

GO{
test:undefined function test(){}
}
//执行console.log(test) //fn
//执行test(1)
AO{
tset:undefined 1 function test(){} 234
}
//fn 234
在这里插入图片描述
举例:

// An highlighted block
global=100;
function fn(){
    console.log(global);
    global=200;
    console.log(global);
    var global=300;
}
fn();
var global;

GO{
global:undefined; 100
fn:function fn(){…}

}
AO{
global:undefined; 200 300
}
undefined 200
在这里插入图片描述
举例:

// An highlighted block
function test(){
    console.log(b);
    if(a){
        var b=100;
    }
    c=234;
    console.log(c);
}
var a;
test();
a=10;
console.log(c);

GO{
a:undefined ; 10
test:function test(){…}
//AO里面没有c就给全局变量
c:234
}
AO{
//不管if
b:undefined;
}
在这里插入图片描述
百度面试题:
在这里插入图片描述
GO{
bar:function bar(){…}
}
AO{
foo:undefined: function foo(){}
}
//fn
在这里插入图片描述
GO{
bar:function bar(){…}
}
AO{
foo:undefined; function foo(){} 10 11
}
//10
举例:
在这里插入图片描述
GO{
a:undefined; 100
demo:function demo(){…}
f:123
}
AO{
e:undefined ; 1 function e(){} 2
b:undefined;
c:undefined; (之前的版本,可以在if里面写函数声明,现在不可以了)functuion c(){}
a:undefined; 10
}
//2 undefined undefined(fn) 10 100 123
举例:
在这里插入图片描述
//1 flase
typeof(a)//“undefined”
-true//-1
+undefined//NaN
//true+false-flase,后面不打印了
举例:
在这里插入图片描述//先执行后面括号里面的,foo="bar"了,在执行前面window.foo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值