js变量作用域--变量提升
2015-05-27 15:02
127 查看
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,显然不是全局变量。
其实这就是[b]变量提升,我的理解是,在函数中使用的任何局部变量,编译器都会把这些变量放在函数的入口处定义,但赋值还是和编写代码时是一样的,也就是说,局部变量的定义其实是在函数入口处,和我们实际编写代码的位置没有关系。赋值才真正的和我们编写代码的位置有关系。[/b]
例如上边的代码可以改写成:
function test(){
var t ;
alert(t);
t="123"
alert(t);
testGlobel();
}
测试最常用的循环计数器和上边的结果是一样的,第一次是undefined!第二次是3是循环后的值,第三次是Uncaught ReferenceError: i is not defined,显然不是全局变量。
这个或许才是和其他语言变量作用域的最大区别吧。
先看具体的例子:
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,显然不是全局变量。
其实这就是[b]变量提升,我的理解是,在函数中使用的任何局部变量,编译器都会把这些变量放在函数的入口处定义,但赋值还是和编写代码时是一样的,也就是说,局部变量的定义其实是在函数入口处,和我们实际编写代码的位置没有关系。赋值才真正的和我们编写代码的位置有关系。[/b]
例如上边的代码可以改写成:
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变量作用域--变量提升
- js 函数定义,使用,作用域,变量声明提升,遇解析.....
- js变量作用域 预解析 提升等
- JS中作用域和变量提升(hoisting)的深入理解
- JS 函数作用域及变量提升那些事!
- js变量作用域和变量提升
- js 作用域,变量提升
- js面试题,关于变量提升,作用域,全局变量
- js变量声明提升,变量作用域与函数作用域,作用域链
- JS的解析机制(作用域、变量提升等)和两个例子
- javascript中的变量作用域以及变量提升详细介绍
- js变量和函数声明的提升(转)
- 深入理解JS中的变量作用域
- js变量作用域var的区别
- Javascript变量作用域、变量提升
- JavaScript的作用域和变量提升
- JS利用prototype改变元素实例的方法的变量作用域
- JS 变量提升
- js中的预解析与变量名提升问题
- Javascript作用域和变量提升