js中的var

vars变量预解析

JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。当你使用了一个变量,然后不久在函数中又重新声明的话,就可能产生逻辑错误。对于JavaScript,只要你的变量是在同一个作用域中(同一函数),它都被当做是声明的,即使是它在var声明前使用的时候。看下面这个例子:

1 // 反例
2    myname = "global"; // 全局变量
3    function func() {
4    alert(myname); // "undefined"
5    var myname = "local";
6    alert(myname); // "local"
7    }
8    func();

在这个例子中,你可能会以为第一个alert弹出的是”global”,第二个弹出”loacl”。这种期许是可以理解的,因为在第一个alert 的时候,myname未声明,此时函数肯定很自然而然地看全局变量myname,但是,实际上并不是这么工作的。第一个alert会弹 出”undefined”是因为myname被当做了函数的局部变量(尽管是之后声明的),所有的变量声明当被悬置到函数的顶部了。因此,为了避免这种混乱,最好是预先声明你想使用的全部变量。

上面的代码片段执行的行为可能就像下面这样:

1    myname = "global"; // global variable
2    function func() {
3    var myname; // 等同于 -> var myname = undefined;
4    alert(myname); // "undefined"
5    myname = "local";
6    alert(myname); // "local"}
7    func();

为了完整,我们再提一提执行层面的稍微复杂点的东西。代码处理分两个阶段,第一阶段是变量,函数声明,以及正常格式的参数创建,这是一个解析和进入上下文 的阶段。第二个阶段是代码执行,函数表达式和不合格的标识符(为声明的变量)被创建。但是,出于实用的目的,我们就采用了”hoisting”这个概念, 这种ECMAScript标准中并未定义,通常用来描述行为。

http://www.nowamagic.net/librarys/veda/detail/1623

http://www.cnblogs.com/jiajiayuan/archive/2013/02/04/2892061.html

http://www.jb51.net/article/35542.htm

时间: 2024-10-22 06:53:49

js中的var的相关文章

js中const,var,let区别

今天面试,被问了个问题,const, var, let的区别,当时就懵圈了,var 知道,const.let 是什么鬼??? 回来一百度,找到一篇通俗易懂的介绍,先取之收藏,以备忘.主要内容是:js中三种定义变量的方式const, var, let的区别. 摘自:http://www.cnblogs.com/ksl666/p/5944718.html 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 3 c

js中加“var”和不加“var”的区别

Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的.可以正常运行的代码并不代表是合适的代码. 1.都加var,在方法内则是局部变量,在方法外则是全局变量. 2.都不加var,全是全局变量. 3.在方法内,加var为局部变量,不加var则是全局变量(在执行当前方法之后). var num1 = 1: 是在当前域中声明变量. 如果在方法中声明,则为局部变量(local variable):如果是在全局域中声明,则为全局变量(

js中的var a = new A;与var a = new A()的区别

JavaScript 中的new关键字与C#,JAVA中的概念完全不一样.  例:var a=new A();  让我们来看看在JavaScript中的new发生了什么?  var a={};//建立了一个新对象:  a.__proto__=A.prototype; //将a的原型指向A:那么a就继承了A的方法与属性!  A.call(a);//调用了A里的构造函数:  document.write(a.__proto__===A.prototype);//为true (ie不支持!因为在IE中

js中加“var”和不加“var”的区别,看完觉得这么多年js白学了

https://www.cnblogs.com/liuna/p/6140901.html Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的.可以正常运行的代码并不代表是合适的代码. var num = 1: 是在当前域中声明变量. 如果在方法中声明,则为局部变量(local variable):如果是在全局域中声明,则为全局变量. 而 num = 1: 事实上是对属性赋值操作.首先,它会尝试在当前作用域链(如在方法中声

判断java或js中的某个字符串中是否包含有某个字符或是字符串

js中: varCts = "aaddssyes"; if(Cts.indexOf("yes") > 0 ){     alert('Cts中包含Text字符串'); } 找的是最开始的位置,如果没找到,则返回的是-1. functionIndexDemo(str){    varstr1 = "BABEBIBOBUBABEBIBOBU"    vars = str1.indexOf(str);    return(s); } str是外边

js中作用域与作用域链详解

一:函数作用域 先看一小段代码: [javascript] view plaincopy var scope="global"; function t(){ console.log(scope); var scope="local" console.log(scope); } t(); 第一句输出的是: "undefined",而不是 "global" 第二讲输出的是:"local" 你可能会认为第一句会输

java、js中实现无限层级的树形结构(类似递归)

js中: var zNodes=[{id:0,pId:-1,name:"Aaaa"},    {id:1,pId:0,name:"A"},    {id:11,pId:1,name:"A1"},    {id:12,pId:1,name:"A2"},    {id:13,pId:1,name:"A3"},    {id:2,pId:0,name:"B"},    {id:21,pId:2

js中,var 修饰变量名和不修饰的区别

js中 允许在定义变量的时候 不加var 修饰符.js会在当前作用域下寻找上下文是否定义了此变量, 如果没有找到则会为这个变量分配内存.当且将其视为window的成员. 也就是全局变量. 如果加了var 修饰符. js会重新为这个变量分配内存,不论当前上下文中是否已经定义过了.这个变量的作用域就为当前上下文. 即局部变量. 不加var的写法是强烈不推荐的.1. 语义不清楚. 2. 团队开发时,容易覆盖掉其它作用域内的变量,引发异常.3. 给window对象添加不必要成员. 等等

第28篇 js中let和var

  let与var 在js中声明一个变量除了一个var 还有一个let的声明.对于var 在前面的作用域中已经讲过,这次主要说下二者的区别: 在MDN上有这样的一个demo: var list = document.getElementById("list"); for (var i = 1; i <= 5; i++) { var item = document.createElement("LI"); item.appendChild(document.cr