JS声明变量背后的原理
来源:互联网 发布:女生降低体脂率 知乎 编辑:程序博客网 时间:2024/04/29 21:57
http://www.cnblogs.com/qgf522/arch
只要是写过点JS代码,很简单一个var 就完事了。那对于JS编译器背后它又发生了什么呢?那就一步步通过代码来讲起。
上面的代码也会你答对了它会分别输出:1,undefined,2。对于我来说,第一反应它会输出:1,1,2。为什么第二个会输出undefined?在上面我明确定义了一个全局变量x,为何找不到?
那是因为:js编译器在执行这个y函数的时候,会把把它body里面的声明变量提前到最前面进行声明。比如:var x=2; 编译器先会在body最前面进行var x 声明。其实上面的代码等同于下面的这段代码:
x = 1;
alert(x);
var
y =
function
() {<br>
var
x;
//此时x还未赋值,所以为undefined。
alert(x);
x = 2;
alert(x);
}
y();
所以也就不难理解x=undefined的了.但是如果把var x = 2;这段代码给删掉,在内部它没有进行var声明。它会一直沿着作用域向上找,此时的x 就为全局x.
接下来再看一个更有趣的例子。
var
a = 1;
function
b() {
a = 10;
return
;
}
b();
alert(a);
///////////////////////////////////
var
a = 1;
function
b() {
a = 10;
return
;
function
a() {}
} b(); alert(a);
例子很简单。第一个例子为输出10,第二个会输出1。这是为什么呢?况且第二个例子我都return 了。按理都应当输出10才对呀!那时因为JS编译器在背后作怪。
两段代码差别就是第二个例子多了个function a(){};便这个函数体里面什么也没有,并且也没有对它进行任何调用。
其实JS编译器在背后会把function a() {}编译成 var a=function (){}。此时对于函数内部也有一个a=10; 外面的a些也还是1;根据JS作用域。会先找内部的a,如果找不到再向上一级一级找。
最张alert(a) 就会显示1;
ive/2012/12/28/2837149.html
- JS声明变量背后的原理
- JS变量重复声明以及忽略var 声明的问题及其背后的原理
- JS变量重复声明忽略的原理
- JS的变量声明
- js中变量的声明
- <Js>ECMAScript变量的声明
- js的冒号声明成员变量
- js 中容易犯错的变量声明
- js中变量声明的问题
- js变量,声明提升的坑
- js变量的声明、类型、以及使用
- JS入门~变量的声明和赋值
- js声明变量
- JS中的变量声明
- JS声明变量类型
- js变量声明
- js 声明变量
- js声明变量
- 草根者创业者前期遇到的一些问题
- 换行和回车的区别
- Sqlserver中tinyint, smallint, int, bigint的区别 及 10进制转换16进制的方法
- Java程序员面试中的多线程问题
- select函数详解
- JS声明变量背后的原理
- ExpandableListView 的几个属性
- 黑马程序员 异常处理机制的总结
- 本人博客的主要关注点
- 如何实现九九乘法口诀表的打印
- javascrip数组以及自定义数组方法
- AutoCAD 二次开发学习系列【4】 - 实现CPropertySheet进行用户交互
- linux上安装QT4
- eclipse代码注释的设置