js基础base function scope 函数作用域

本文详细探讨了JavaScript中的全局变量、局部变量、隐式全局变量的概念及其使用范围,包括全局作用域、局部作用域和块级作用域的区别,并讨论了变量的生命周期与内存管理。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>$永远的24k纯帅$</title>
  <script>
    //作用域:使用范围
    /*
    *
    * 全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用
    * 除了函数以外,其他的任何位置定义的变量都是全局变量
    * 局部变量:在函数内部定义的变量,是局部变量,外面不能使用
    * 全局变量,如果页面不关闭,那么就不会释放,就会占空间,消耗内存
    *
    * 全局作用域:全局变量的使用范围
    * 局部作用域:局部变量的使用范围
    *
    * 块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在js中在这个块级作用域中定义的变量,外面也能使用;
    * 说明:js没有块级作用域,只有函数除外
    *
    * 隐式全局变量:声明的变量没有var,就叫隐式全局变量
    * 全局变量是不能被删除的,隐式全局变量是可以被删除的
    * 定义变量使用var是不会被删除的,没有var是可以删除的   建议定义变量用var
    *
    *
    * */

//    function f1() {
//      number=1000;//是隐式全局变量
//    }
//    f1();
//    console.log(number);

//    var num1=10;
//    num2=20;
//    delete num1;//把num1删除了
//    delete num2;//把num2删除了
//    console.log(typeof num1);
//    console.log(num1+10);
//    console.log(typeof num2);

 


//    num=100;
//    console.log(num);

    //扩展:隐式


//    function f1() {
//      var num=100;
//      num+=10;
//    }
//    f1();//这个函数结束之后


//    {
//      var num=10;
//      console.log(num);//10
//    }
//    console.log(num);

//    if(true){
//      var num=10;
//    }
//    console.log(num);
//    for(var i=0;i<5;i++){
//      var number=20;
//    }
//    console.log(number);

//    var i=0;
//    while (i<5){
//      var num=100;
//      i++;
//    }
//    console.log(num);


//    function f1() {
//      var num=10;
//    }
//    f1();
//    console.log(num);

 

//    var num=10;
//    console.log(num);//10
  </script>
  <script>
    //console.log(num);
  </script>
</head>
<body>


</body>
</html>

# ==================== 1. 局部作用域(Local Scope) ==================== """ 📚 局部作用域: - 定义:函数内部定义的作用域 - 生命周期:函数调用时创建,函数结束时销毁 - 访问规则:仅在函数内部可访问 - 变量类型:局部变量 - 特点:每次函数调用都创建新的作用域 """ def local_scope_demo(): """局部作用域示例函数""" local_count = 0 # 定义局部变量 local_count += 1 # 修改局部变量 print(f"局部计数: {local_count}") # 输出局部变量值 # 测试局部作用域 print("=== 局部作用域示例1 ===") local_scope_demo() # 输出: 局部计数: 1 local_scope_demo() # 输出: 局部计数: 1(每次调用重新创建) def another_local_demo(): """另一个局部作用域示例""" message = "Hello" # 局部字符串变量 print(f"局部消息: {message}") # 访问局部变量 print("\n=== 局部作用域示例2 ===") another_local_demo() # 输出: 局部消息: Hello # ==================== 2. 闭包作用域(Enclosing Scope) ==================== """ 📚 闭包作用域: - 定义:嵌套函数中,外层函数作用域 - 生命周期:外层函数调用时创建,当内层函数仍被引用时保持 - 访问规则:内层函数可访问外层函数变量 - 核心价值:实现状态保持和封装 - 特点:闭包变量在多次调用间保持状态 """ # ==================== nonlocal关键字的深入解析 ==================== """ 🔍 nonlocal关键字的作用: 1. 声明变量来自外部嵌套作用域(非全局作用域) 2. 允许内部函数修改外部函数的变量 3. 解决闭包中变量修改的"UnboundLocalError"问题 """ # 使用闭包实现计数器 def create_counter(): """创建计数器闭包(使用闭包作用域)""" count = 0 # 闭包变量,在外部函数作用域 def increment(): """增加计数器(内部函数)""" nonlocal count # 声明使用闭包变量 count += 1 # 修改闭包变量 return count return increment # 返回闭包函数 # 不使用闭包实现计数器(使用全局变量) global_count = 0 # 全局变量 def increment_global(): """增加全局计数器(不使用闭包)""" global global_count # 声明使用全局变量 global_count += 1 # 修改全局变量 return global_count # 测试闭包与非闭包实现 print("\n=== 闭包 vs 非闭包实现 ===") print("闭包计数器:") counter1 = create_counter() # 创建第一个计数器闭包 print("计数器1第一次:", counter1()) # 输出: 1 print("计数器1第二次:", counter1()) # 输出: 2(状态保持) counter2 = create_counter() # 创建第二个计数器闭包 print("计数器2第一次:", counter2()) # 输出: 1(独立状态) print("\n全局变量计数器:") print("全局计数器第一次:", increment_global()) # 输出: 1 print("全局计数器第二次:", increment_global()) # 输出: 2 print("全局计数器状态:", global_count) # 输出: 2(全局状态被修改) # 闭包实现函数工厂 def create_power_function(exponent): """创建幂函数闭包工厂(使用闭包)""" def power(base): """计算幂函数(内部函数)""" return base ** exponent # 使用闭包变量exponent return power # 返回闭包函数 # 非闭包实现相同功能 def power_function(base, exponent): """普通幂函数(不使用闭包)""" return base ** exponent # 需要同时传入base和exponent # 测试函数工厂 print("\n=== 闭包函数工厂 ===") square = create_power_function(2) # 创建平方函数闭包 cube = create_power_function(3) # 创建立方函数闭包 print("闭包平方(5):", square(5)) # 输出: 25(只需传入base) print("闭包立方(5):", cube(5)) # 输出: 125(只需传入base) print("普通函数平方(5, 2):", power_function(5, 2)) # 输出: 25(需两个参数) print("普通函数立方(5, 3):", power_function(5, 3)) # 输出: 125(需两个参数) # ==================== 3. 全局作用域(Global Scope) ==================== """ 📚 全局作用域: - 定义:模块级别的作用域 - 生命周期:模块加载时创建,程序结束时销毁 - 访问规则:整个模块内可访问 - 变量类型:全局变量(使用global关键字可修改) - 特点:全局共享,需谨慎使用 """ # 全局作用域示例1 global_var = "初始值" # 定义全局变量 def modify_global(): """修改全局变量函数""" global global_var # 声明使用全局变量 global_var = "修改后的值" # 修改全局变量 print(f"函数内部: {global_var}") # 输出修改后的值 # 全局作用域示例2 config = {"debug": True} # 全局配置字典 def toggle_debug(): """切换调试模式""" global config config["debug"] = not config["debug"] # 修改全局字典 print(f"调试模式: {config['debug']}") # 测试全局作用域 print("\n=== 全局作用域示例1 ===") print("调用前:", global_var) # 输出: 初始值 modify_global() # 修改全局变量 print("调用后:", global_var) # 输出: 修改后的值 print("\n=== 全局作用域示例2 ===") toggle_debug() # 输出: 调试模式: False toggle_debug() # 输出: 调试模式: True # ==================== 4. 内置作用域(Built-in Scope) ==================== """ 📚 内置作用域: - 定义:Python内置名称的作用域 - 生命周期:Python解释器启动时创建,结束时销毁 - 访问规则:任何地方都可访问 - 内容:Python内置函数和类型(如print, len, int等) - 特点:最高优先级,但可被覆盖 """ # 内置作用域示例1 def builtin_usage(): """使用内置函数示例""" length = len("Python") # 使用内置len函数 num = int("42") # 使用内置int函数 print(f"长度: {length}, 数字: {num}") # 使用内置print函数 # 内置作用域示例2(覆盖内置函数) def override_builtin(): """覆盖内置函数示例""" global len # 声明修改全局len len = lambda x: 42 # 覆盖内置len函数 print("覆盖后长度:", len("test")) # 输出: 42 # 测试内置作用域 print("\n=== 内置作用域示例1 ===") builtin_usage() # 输出: 长度: 6, 数字: 42 print("\n=== 内置作用域示例2 ===") override_builtin() # 输出: 覆盖后长度: 42 # 恢复内置函数 del len # 删除覆盖 print("恢复后长度:", len("test")) # 输出: 4(使用内置len) 讲的还是太粗了,需要考虑到是给0基础的学生讲,也没有总结,4个作用域,注释不够详细,比如你这样说闭包没人听得懂
最新发布
08-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值