JavaScript var声明变量背后的原理示例解析

 更新时间:2013年10月12日 16:52:41   作者:  
只要是写过点JS代码,很简单一个var 就完事了,那么JS编译器背后它又发生了什么呢?在本文将为大家详细介绍下,感兴趣的朋友不要错过
只要是写过点JS代码,很简单一个var 就完事了。那对于JS编译器背后它又发生了什么呢?那就一步步通过代码来讲起。
复制代码 代码如下:

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() {<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;

相关文章

  • javascript cookie用法基础教程(概念,设置,读取及删除)

    javascript cookie用法基础教程(概念,设置,读取及删除)

    这篇文章主要介绍了javascript cookie用法,结合实例形式总结分析了javascript中cookie的定义、特点及获取、设置、删除等基本操作技巧,需要的朋友可以参考下
    2016-09-09
  • 有关JavaScript中call()和apply() 的一些理解

    有关JavaScript中call()和apply() 的一些理解

    下面小编就为大家带来一篇有关JavaScript中call()和apply() 的一些理解。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • JavaScript中的acos()方法使用详解

    JavaScript中的acos()方法使用详解

    这篇文章主要介绍了JavaScript中的acos()方法使用详解,是JS入门学习中的基础知识,需要的朋友可以参考下
    2015-06-06
  • ES6学习之变量的解构赋值

    ES6学习之变量的解构赋值

    有时变量多写起来真的很麻烦,很多繁琐的差不多的重复工作,es6为我们提供了多种更加便利的声明变量的形式——变量的解构赋值。下面这篇文章主要介绍了ES6中变量解构赋值的相关资料,需要的朋友可以参考下。
    2017-02-02
  • 完全不用基础的HTML5入门篇教程

    完全不用基础的HTML5入门篇教程

    HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等
    2022-03-03
  • JavaScript基础之this详解

    JavaScript基础之this详解

    JavaScript中函数的this对象是函数在执行时所处的作用域(例:当在网页的全局作用域中调用函数时,this对象引用的就是window)。
    2017-06-06
  • 谈谈关于JavaScript 中的 MVC 模式

    谈谈关于JavaScript 中的 MVC 模式

    本文介绍了模型-视图-控制器模式在 JavaScript 中的实现,有需要的朋友可以参考一下
    2013-04-04
  • js css后面所带参数含义介绍

    js css后面所带参数含义介绍

    网页链接的js css后面总是带有一些参数,想必大家并不陌生,下面为大家介绍下这些参数的含义,感兴趣的朋友可以参考下
    2013-08-08
  • YUI模块开发原理详解

    YUI模块开发原理详解

    这篇文章主要介绍YUI模块化开发的原理,提供了代码给大家学习参考使用
    2013-11-11
  • JavaScript高级程序设计(第3版)学习笔记7 js函数(上)

    JavaScript高级程序设计(第3版)学习笔记7 js函数(上)

    如果说对象是房间,那么函数就是有魔幻效应的房间了。函数首先是对象,然后这个函数对象还具有很多魔幻功能
    2012-10-10

最新评论