js连等赋值的陷阱
2024-09-12 03:41:05
先来看一段代码:
(function(){
var x = y = 1;
})();
console.log(y);
console.log(x);
最开始我觉得这道题简直是送分题啊,很明显结果为,y=1;x=1
然后当我在控制台输出以后,感觉一记响亮的耳光,输出结果:
结论:上面的结果是因为变量提升和连等赋值造成的。
分析:上面的 var x=y=1 容易理解为var x=y,var y=1; 因为这里使用了连等赋值,连等操作符赋值是从右向左的,相当于 y=1; var x =y;
然后又因为变量提升,会把所有声明提前(只是声明提前,赋值不提前)到函数体顶部,var x=y=1,实际相当于,y=1; var x=y;
所以上面代码console.log(y)的值为1,因为y=1没有用var在函数体内部声明,所以不是局部变量,是全局变量。
注:① 没有用var声明的变量,即使在函数内,也是全局变量;
② 用var声明了变量,但在函数体外,没有在函数体内的也是全局变量
③ 在函数体内,但没有用var声明的变量也是全局变量;
④ 在函数体内,并用var声明的变量才是局部变量
⑤ 变量提升只是声明提前到函数体顶部,赋值不会提前
可能你会问,那上面console.log(x)为什么不是输出undefined,而是报错呢?
调用在该作用域未声明的变量,是会报错的。而一个变量只声明,但未定义赋值的时候,才会是undefined。这里变量x在全局作用域未曾声明,并不存在,所以会报错!
所以综上述,建议大家还是尽量不要用连等赋值,会有很多隐患
最新文章
- AFNetworking报错";_UTTypeCopyPreferredTagWithClass";, referenced from: _AFContentTypeForPathExtens
- hibernate关联映射学习
- UniversalAndroidImageLoader出现异常:ImageLoader: Unable to resolve host ";https";: No address associated with host
- Input 值改变触发事件
- 解决ewebeditor for php在IE8下报editor.js错误的解决方案
- iOS: imageIO完成渐进加载图片
- 修复iPhone的safari浏览器上submit按钮圆角bug
- linux笔试
- windows form (窗体) 之间传值小结
- 地址栏访问Action,后来方法执行两次
- Oracle EBS使用adpatch工具打patch过程【Z】
- Asp.net MVC 视图使用像Ajax,ViewBag提示为找到上下文
- Mycat 分片规则详解--数据迁移及节点扩容
- Asp.Net Core 轻松学-多线程之取消令牌
- QTREE6&;&;7 - Query on a tree VI &;&;VII
- python爬虫-淘宝商品密码(图文教程附源码)
- buildroot构建项目(八)--- u-boot 2017.11 适配开发板修改 5 ---- 系统启动初始化之五
- Redis Cluster 简单安装配置
- 九度OJ小结
- UVa 12545 比特变换器
热门文章
- jquery取每个li元素下的第三个a元素
- cookie存储
- TensorFlow升级到1.13
- Python 打印矩形、直角三角形、等腰三角形、菱形
- Javascript中表达式和语句的区别
- 2019.03.25 bzoj4567: [Scoi2016]背单词(trie+贪心)
- 微信小程序的自定义插件
- golang打造基于mail的提醒服务
- spring InitializingBean和DisposableBean init-method 和destroy-method @PostConstruct @PreDestroy
- 关于Socket.IO的知识点记录