V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wymanAtV2
V2EX  ›  程序员

关于 Javascript 的变量定义一点疑惑,求各位大佬指导

  •  
  •   wymanAtV2 · 2020-11-23 17:11:36 +08:00 · 1489 次点击
    这是一个创建于 1242 天前的主题,其中的信息可能已经有所发展或是发生改变。
    js 里面直接访问一个未声明的变量是会报错“xxx is not defined”的,但是当我创建一个对象或者直接使用宿主对象时,例如浏览器环境下 window.variable,是会返回一个 undefined 的,这一点有点疑惑,这和 undefined 的定义不是有冲突吗,variable 还没声明啊?
    求各位指教🙏
    10 条回复    2020-11-23 18:39:03 +08:00
    wyongjian
        1
    wyongjian  
       2020-11-23 17:16:29 +08:00
    后者的 undefined 只是说明没有返回值吧
    wymanAtV2
        2
    wymanAtV2  
    OP
       2020-11-23 17:23:02 +08:00
    @wyongjian 嗯嗯,这个您启发了我,不过我还是不太能理解两者在使用的表现上的不同,例如有一个函数需要一个参数,我传递参数的时候 func(a,),此时我传入一个未定义的变量 variable,肯定是会报错的;但是我传入一个对象的属性,他是会默认传入一个 undefined 的;
    xiongotom
        3
    xiongotom  
       2020-11-23 17:25:09 +08:00
    undefined 不就是未声明嘛,符合定义啊。可能你的疑惑时为啥直接访问会报错,直接使用变量的时候是不会在 window 上自动创建一个变量的;但比如 a = 10 这样子,是会在 window 上自动创建一个变量,原因是有个 LHS 和 RHS 的区别,简单理解就是在赋值操作符的左边就会自动创建,右边则不会。
    wymanAtV2
        4
    wymanAtV2  
    OP
       2020-11-23 17:28:46 +08:00
    @xiongotom 嗯嗯,首先感谢您的解惑,您的解释我是理解的;我疑惑的点在于后者,为什么直接访问一个对象里的属性就不会有报错?
    zzzzzzggggggg
        5
    zzzzzzggggggg  
       2020-11-23 17:33:04 +08:00
    undefined 会在以下几种情况返回:
    1. 没有返回语句的函数运行结束,就会返回 undefined
    2. 访问数组中不存在的下标和对象不存在的属性
    3. void 运算符会返回 undefined

    其他的情况按照你理解的返回即可
    wymanAtV2
        6
    wymanAtV2  
    OP
       2020-11-23 17:35:54 +08:00
    @zzzzzzggggggg 🙏原来点在于 undefined,十分感谢
    marcong95
        7
    marcong95  
       2020-11-23 17:38:35 +08:00
    @wymanAtV2 #4 因为 window.a 这种用法既可以作为 LHS 又可以作为 RHS ?或者说 window 本身就是一个已经定义的变量,window.a 只是对已定义的变量指向的对象的一个属性 a 进行操作,而这种操作并不是对未定义变量的操作,所以不会产生错误?
    xiongotom
        8
    xiongotom  
       2020-11-23 17:56:35 +08:00
    @marcong95 是的。js 中的定义就是这样,如果方法或者语句中操作的变量没有赋值,就会返回 undefined ;直接使用变量会报错是因为 js 引擎一直找到 window 都找不到这个变量。而用 window.a 的话,就是前面那一条规则,js 变量上的属性本就无需特地的去声明一下。
    yzqtdu
        9
    yzqtdu  
       2020-11-23 18:10:54 +08:00
    还有一点很多人没提到的是,JS 里的对象十分灵活,可以动态添加、删除属性,因此设计的时候允许访问未定义属性可以避免一些不必要的麻烦,例如根据条件添加某个属性,如果条件不成立未绑定则后面的访问报错,成立则顺利运行,这样所有对该属性的访问都要加上是否存在的判断,if (prop in obj && typeof obj[prop] == "function") obj[prop]()
    wymanAtV2
        10
    wymanAtV2  
    OP
       2020-11-23 18:39:03 +08:00
    感谢各位的指点🙏~~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3644 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 04:29 · PVG 12:29 · LAX 21:29 · JFK 00:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.