js中不容小觑的var声明
在学习vue相关课程中,有一次跟着老师敲代码,写出了如下代码:
var Child = {
template:`<div @click='handleClick'><slot></slot></div>`,
methods:{
handleClick(){
this.$bus.$emit( 'change' );
},
},
mounted(){
var self = this;
counter = 0;
this.$bus.$on( 'change',function(){
counter++;
console.log( "you clicked "+counter+" times" );
} );
}
};
将组件注册到app实例后,实例化3个子组件,在点击触发'click'的时候,打印效果如下:

点击一次执行3次可以理解,因为每个子组件都给prototype里的$bus总线push了自己的事件处理函数,但理论上来讲,每个组件实例化的过程中,都会调用自己的mounted钩子,在钩子里因为闭包的存在,形成可保存的作用域,所以,每个实例都有自己独立的的context( 如counter ),即:应该执行3次,但counter不应该累加,应该出现3个'you clicked 1 times'。
觉得迷糊,我自己又按照自己的理解写了一遍代码,运行,结果好好的,就是上述期待效果,问题在哪呢?
将两个文件逐行对比后,定位到了问题:

正确的版本

出问题的版本
两个版本之间唯一的差别是,counter变量一个用var声明了,一个没有,于是赶紧搜起...看到这么一篇文章,其中与我的问题相关的核心描述在此:

看到此处,豁然开朗,所以不加var的变量都绑在了全局window对象上,不会再根据mounted钩子函数的执行单独创建作用域了,所有child实例push到$bus里的事件处理函数访问的都是window.counter,所以数值累加就是正常表现了。
看来js代码中var的使用不容小觑,对于声明的任何一个变量都要做到胸有成竹,是不是要绑在window上做全局用?如果不是,一定要加var,使其在自身作用域内运行,防止污染全局。
js中不容小觑的var声明的更多相关文章
- js中局部变量必须用var去声明
js中的变量与其他的脚本语言都是很不一样的,在function中你如果不用var 声明一个变量,那么这个变量将在全局可见,也就相当于创建了全局变量.所以在function中声明变量尽量都是用var来声 ...
- 前端面试题:JS中的let和var的区别
最近很多前端的朋友去面试被问到let和var的区别,其实阮一峰老师的ES6中已经很详细介绍了let的用法和var的区别.我简单总结一下,以便各位以后面试中使用. ES6 新增了let命令,用来声明局部 ...
- js中的let和var
在ES6中,应该尽量使用const和let来声明变量,而尽量避免使用var. var的缺点是它的作用域比较混乱,使用let能够保证清晰的作用域. 下面看一个小例子. var x = 3; if(x== ...
- js中函数提升及var变量提示
其中,在javascript中,函数声明及var声明的变量会得到提升.但是函数声明会先于var声明的变量被提升.即便function写在后面. 看下面的例子: var aa = 221; functi ...
- JS中的let和var的区别
最近很多前端的朋友去面试被问到let和var的区别,其实阮一峰老师的ES6中已经很详细介绍了let的用法和var的区别.我简单总结一下,以便各位以后面试中使用. ES6 新增了let命令,用来声明局部 ...
- 深入探究js中的隐式变量声明
前两天遇到的问题,经过很多网友的深刻讨论,终于有一个相对可以解释的通的逻辑了,然后我仔细研究了一下相关的点,顺带研究了一下js中的隐式变量. 以下文章中提到的隐式变量都是指没有用var,let,con ...
- js中定义变量之②var let const的区别
var 上一篇文章有讲过,是js定义变量的关键词. 但是在es6中,新添加了两个关键词,用于变量声明的关键词:let 和const 接下来就说一下var let 和const的区别: 首先说var 用 ...
- node.js中允许的app对象声明方式
伪对象形式 app = function () { console.log("我是一个初始化的app对象"); }; app.get=function () { console.l ...
- js中定义变量加var与不加var的区别?
var 不一定是用来定义局部变量的 jscript的全局变量和局部变量的分界是这样的: 过程体(包括方法function,对象Object o ={})外的所有变量不 ...
随机推荐
- git format-patch 用法
git format-patch HEAD^ # git format-patch -s 1bbe3c8c197a35f79bfddaba099270a2e54ea9c7 please replace ...
- Java 字符串比较小知识
使用 String.compareTo 方法: compareTo() 的返回值是int, 它是先比较对应字符的大小(ASCII码顺序). 1.如果字符串相等,返回值0. 2.如果第一个字符和参数的第 ...
- 如何去掉idea里mybatis的.xml文件 sql 语句背景色
点击有背景的地方 Alt+Enter选择 un-inject Language/refence 即可去掉
- 第四届蓝桥杯C++B组省赛
1.高斯日记 2.马虎的算式 3.第39级台阶 4.黄金连分数 5.前缀判断 6.三部排序 7.错误票据 8.翻硬币 9.带分数 10.连号区间数
- hdu2552
点击打开链接 思路: 1.tan(a+b) = ( tan(a) + tan(b) ) / (1 – tan(a) * tan(b) ) 2.tan( atan(x) ) = x arctan(1/s ...
- iOS 堆和栈的区别和联系
堆和栈的区别主要有以下五点: 1.管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来讲,释放工作由程序员控制,容易产生memory leak(内存泄露). 2.申请大小: 栈是向低地 ...
- ImportError: No module named 'httplib'
原因:Python 2.x中的"httplib"模块在Python 3.x中变成了"http.client" 原代码: import httplib impor ...
- 实现列表两端完全对其text-aligh:justify 和display:inline-block
dispaly:inline-block 对于块级元素,在IE8-下是不兼容的,所以一般不要用在这些元素上,可以用在inline元素上:span text-align:justify实现子元素完全对齐 ...
- 【推荐】 体验SubSonic
SubSonic简介 SubSonic配置 利用sonic.exe来生成代码 通过Substage来生成代码 简单操作示例 1.SubSonic简介 一句讲完就是:SubSonic就是一个ORM开源框 ...
- 插入符的创建(MFC)
int CDrawRectangleDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { ) ; // TODO: 在此添加您专用的创建代码 CreateSol ...