关于 Javascript 的变量定义一点疑惑,求各位大佬指导 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
wymanAtV2
V2EX    程序员

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

  •  
  •   wymanAtV2 2020-11-23 17:11:36 +08:00 2118 次点击
    这是一个创建于 1787 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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     Solana     2933 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 00:22 PVG 08:22 LAX 17:22 JFK 20:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86