JS声明变量背后的原理 (转载)
2013-06-15 10:00
330 查看
只要是写过点JS代码,很简单一个var 就完事了。那对于JS编译器背后它又发生了什么呢?那就一步步通过代码来讲起。
上面的代码也许你答对了它会分别输出:1,undefined,2。对于我来说,第一反应它会输出:1,1,2。为什么第二个会输出undefined?在上面我明确定义了一个全局变量x,为何找不到?
那是因为:js编译器在执行这个y函数的时候,会把把它body里面的声明变量提前到最前面进行声明。比如:var x=2; 编译器先会在body最前面进行var x 声明。其实上面的代码等同于下面的这段代码:
所以也就不难理解x=undefined的了.但是如果把var x = 2;这段代码给删掉,在内部它没有进行var声明。它会一直沿着作用域向上找,此时的x 就为全局x.
接下来再看一个更有趣的例子。
例子很简单。第一个例子为输出10,第二个会输出1。这是为什么呢?况且第二个例子我都return 了。按理都应当输出10才对呀!那时因为JS编译器在背后作怪。
两段代码差别就是第二个例子多了个function a(){};便这个函数体里面什么也没有,并且也没有对它进行任何调用。
其实JS编译器在背后会把function a() {}编译成 var a=function (){}。此时对于函数内部也有一个a=10; 外面的a些也还是1;根据JS作用域。会先找内部的a,如果找不到再向上一级一级找。
最张alert(a) 就会显示1;
x = 1; alert(x); var y = function() { alert(x); var x = 2; alert(x); } y();
上面的代码也许你答对了它会分别输出:1,undefined,2。对于我来说,第一反应它会输出:1,1,2。为什么第二个会输出undefined?在上面我明确定义了一个全局变量x,为何找不到?
那是因为:js编译器在执行这个y函数的时候,会把把它body里面的声明变量提前到最前面进行声明。比如:var x=2; 编译器先会在body最前面进行var x 声明。其实上面的代码等同于下面的这段代码:
x = 1; alert(x); var y = function() { 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;
相关文章推荐
- JS声明变量背后的原理
- JS声明变量背后的编译原理剖析
- JavaScript var声明变量背后的原理示例解析
- JS变量重复声明忽略的原理
- 转载:写了10年Javascript未必全了解的连续赋值运算 --> 说明了JS中变量是引用
- Js中有关变量声明和函数声明提升的问题
- js中声明全局变量
- ThreadLocal类型变量为何声明为静态?- ThreadLocal实现原理
- js中 如何声明隐式全局作用域变量
- JS 学习笔记--2--变量的声明
- (转载)表变量在存储过程中出现了"必须声明表变量"的错误
- [转载]js正则表达式/replace替换变量方法
- js变量的声明、作用域以及闭包
- js变量声明提升
- 编译原理——变量声明语句(一)
- 一个讨论引发关于js中函数声明,函数表达式,形参与变量声明赋值引发的一些事
- js中如何声明变量
- js变量声明提升&undefined
- js变量声明提升,变量作用域与函数作用域,作用域链