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

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

其他的情况按照你理解的返回即可
wymanAtV2
2020-11-23 17:35:54 +08:00
@zzzzzzggggggg 🙏原来点在于 undefined,十分感谢
marcong95
2020-11-23 17:38:35 +08:00
@wymanAtV2 #4 因为 window.a 这种用法既可以作为 LHS 又可以作为 RHS ?或者说 window 本身就是一个已经定义的变量,window.a 只是对已定义的变量指向的对象的一个属性 a 进行操作,而这种操作并不是对未定义变量的操作,所以不会产生错误?
xiongotom
2020-11-23 17:56:35 +08:00
@marcong95 是的。js 中的定义就是这样,如果方法或者语句中操作的变量没有赋值,就会返回 undefined ;直接使用变量会报错是因为 js 引擎一直找到 window 都找不到这个变量。而用 window.a 的话,就是前面那一条规则,js 变量上的属性本就无需特地的去声明一下。
yzqtdu
2020-11-23 18:10:54 +08:00
还有一点很多人没提到的是,JS 里的对象十分灵活,可以动态添加、删除属性,因此设计的时候允许访问未定义属性可以避免一些不必要的麻烦,例如根据条件添加某个属性,如果条件不成立未绑定则后面的访问报错,成立则顺利运行,这样所有对该属性的访问都要加上是否存在的判断,if (prop in obj && typeof obj[prop] == "function") obj[prop]()
wymanAtV2
2020-11-23 18:39:03 +08:00
感谢各位的指点🙏~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/728405

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX