**js的变量和其他语言的变量作用域,有很多相同的地方,但也有很多不相同的地方。尤其是变量提升这个概念。之前还真没听说过这个概念。**
**先看具体的例子:**
~~~
function test2(){
alert(t);
var t="123"
alert(t);
}
~~~
按照之前的理解,第一个alert就应该出错。可是在谷歌浏览器已测试,没有错误。第一次弹出来的是undefined!!第二次是123,和一般语言里是一样的。
没有错误,说明t这个变量已经定义,那是不是全局变量呢?
~~~
function test(){
alert(t);
var t="123"
alert(t);
testGlobel();
}
function testGlobel(){
alert(t);
}
~~~
前两次和之前的一样,最后一次Uncaught ReferenceError: t is not defined,显然不是全局变量。
其实这就是变量提升,我的理解是,在函数中使用的任何局部变量,编译器都会把这些变量放在函数的入口处定义,但赋值还是和编写代码时是一样的,也就是说,局部变量的定义其实是在函数入口处,和我们实际编写代码的位置没有关系。赋值才真正的和我们编写代码的位置有关系。
**例如上边的代码可以改写成:**
~~~
function test(){
var t ;
alert(t);
t="123"
alert(t);
testGlobel();
}
~~~
测试最常用的循环计数器和上边的结果是一样的,第一次是undefined!第二次是3是循环后的值,第三次是Uncaught ReferenceError: i is not defined,显然不是全局变量。
~~~
function test(){
alert(i);
var arr=[4,2,6];
for(var i=0;i<arr.length;i++)
{
}
alert(i);
testGlobel();
}
function testGlobel(){
alert(i);
}
~~~
这个或许才是和其他语言变量作用域的最大区别吧。
- 前言
- js封装和作用域
- 封装html的select标签的js操作
- js正则表达式的使用
- 使用闭包对setTimeout进行简单封装
- js中如何复制一个对象,如何获取所有属性和属性对应的值
- js中如何把字符串转化为对象
- js操作iframe兼容各种浏览器
- js模板方法的思路及实现
- 在js中如何实现方法重载?以及函数的参数问题
- 单纯的html页面如何提交,传递参数,以及对身份的验证
- ajax如何调试
- js综合应用简单的表格统计
- js格式化货币数据
- js综合应用:表格的四则运算
- 如何在浏览器中打开PDF文件并实现预览的思路与代码
- js实现幻灯片效果
- js实现幻灯片效果二
- jquery-easyui必填项隐藏问题的处理方案
- jquery-easyui隐藏可用不可用的问题的处理方案
- js变量作用域--变量提升