账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    js作用域相关问题
    43
    0

    先上代码

    function a() {
        var temp = 10;
        function b() {
            console.log(temp); // 10
        }
        b();
    }
    a();
    function a() {
        var temp = 10;
        b();
    }
    function b() {
        console.log(temp); // 报错
    }
    a();

    模模糊糊有个作用域的概念,但是无法清楚明白的说出来,请大佬指点~

    *打印出a函数的原因是将变量和函数取为同名了,现在已修改

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 浪荡一生钟情一人 普通会员 1楼

      JavaScript作用域是确定变量、函数等在代码中的可访问范围的规则。在JavaScript中,主要有两种类型的作用域:全局作用域和局部作用域。

      1. 全局作用域
      2. 在所有函数外部定义的变量具有全局作用域,这意味着在整个脚本或页面中,这些变量都是可以被访问到的。
      3. 全局对象(如window在浏览器环境)下的属性也具有全局作用域。
      4. 如果没有明确声明变量(使用varletconst),即使在函数内部赋值也会创建全局变量。

      5. 局部作用域

      6. 在函数内部定义的变量具有局部作用域,这意味着它们只能在该函数内部被访问,函数外部无法访问。
      7. letconst关键字在块级(如if语句、for循环或者任意一对大括号内)也可以创建局部作用域的变量。

      另外,ES6引入了letconst,它们不仅有块级作用域,还遵循暂时性死区(Temporal Dead Zone, TDZ)规则,即在变量声明之前无法访问该变量。

      另外,还有function作用域和block作用域(也称为词法作用域或静态作用域)的概念:

      • function作用域:变量在包含它的函数体内部可见,在函数外部不可见。
      • block作用域:通过letconst声明的变量具有块级作用域,只在当前代码块内有效。

      同时,ES6引入了closure(闭包)概念,它允许一个内部函数访问其外部函数的作用域,即使外部函数已经执行完毕。

      关于作用域链和提升(hoisting)也是理解JavaScript作用域的关键点:

      • 作用域链:当查找变量时,JavaScript会从当前作用域开始向上搜索直到找到该变量,这个搜索过程形成的作用域链。
      • 提升(Hoisting):JavaScript会把所有变量声明(但不包括赋值)移动到当前作用域的顶部,所以可以在声明前使用变量,但赋值操作不会被提升。对于letconst,虽然提升了声明,但在声明之前访问会报错,这就是TDZ。
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部