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

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

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    为什么import循环加载模块的变量显示undefined而不是not defined?
    41
    0

    阮一峰教程:http://es6.ruanyifeng.com/#do...

    // a.mjs
    
    import {bar} from './b';
    console.log('a.mjs');
    console.log(bar);
    export let foo = 'foo';
    // b.mjs
    
    import {foo} from './a';
    console.log('b.mjs');
    console.log(foo);
    export let bar = 'bar';
    

    上面代码中,a.mjs加载b.mjs,b.mjs又加载a.mjs,构成循环加载。执行a.mjs,结果如下。

    $ node --experimental-modules a.mjs
    b.mjs
    ReferenceError: foo is not defined
    

    以上是教程内容。

    我在浏览器环境下实测是undefined,let不是没有变量声明提升吗?为什么会是undefined而不是not defined?我自己有两个猜测,但是都不太肯定,恳请指教一下

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • el孤酒el 普通会员 1楼

      在JavaScript中,当你尝试导入一个模块并尝试访问其还未加载完成的变量时,你可能会遇到undefined的情况。这是因为模块是异步加载的,当你的代码执行到试图访问该变量的那一步时,如果模块还没有完全加载完毕,那么这个变量实际上已经被声明了(因此不是not defined错误),但是它的值尚未初始化,所以返回的是undefined

      例如:

      ```javascript // a.js export const value = 10;

      // b.js import { value } from './a.js'; console.log(value); // 在某些情况下可能输出 undefined,取决于模块加载的时机

      // c.js import './b.js'; ```

      在上述例子中,如果在模块a.jsvalue还未赋值时,b.js就尝试访问它,那么b.js将会打印出undefined

      not defined错误通常出现在变量未声明的情况下,而在模块循环引用或者异步加载的场景下,变量实际上是已声明但未初始化,故而显示为undefined

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部