JavaScript中的关键字"VAR"使用详解 分享

看看下面这几个例子的结果就知道问题了:
这三个例子的执行结果分别是:


代码如下:

Results#region Results
No.1
0
undefined
No.2
0
1
No.3
0
undefined
#endregion

原来JavaScript的变量也是有作用域的,只是它非常的笼统,就分为全局变量和函数变量。在第二个例子中得到0和1,是因为所有的变量都是全局变量,而且那个语句块一共就定义了两个变量。而第一个第三的函数外全局变量,确实说明var关键字有没有都没有关系。而函数内的var关键字就很关键了,它说明第二个var01是函数内的变量,所以在初始化var01前输出自然就是'undefined'了。
那么函数里面是不是就屏蔽掉了全局的var01了呢?我们知道在C/C++可以使用::去访问全局变量,那么JavaScript可不可以呢?这里其实我们只要明白了全局变量到底是什么东西,就好弄了。原来全局变量都是动态添加到Window对象的实例window上的属性而以,所以我们只要在函数内用:document.write(window.var01);就可以取到其值1了。同时在这个上下文中,function内的this也是指向的window实例,我们也可以把引用写成:this.var01。
顺便说一下,重看JScript教程时,它说变量只能是[a-zA-Z_]+[a-zA-Z0-9_]*格式,可是'$'却也可以作为变量名字符,而且还可以用在开头,比如:$1234,更甚至于:$$$ 也是合法的变量名,faint。
我想知道是不是.在调用一个函数时,程序执行顺序会先检查函数内部变量中,有没有关键字var. 然后中再根据检查结果给不同的变量付予不同的作用域和变量值.因为我看到在这三个函数中,var01变量都是在输出语句之后.


代码如下:

function get_global_var(___name)
{
return eval(___name);
}
function set_global_var(___name,___value)
{
eval(___name+"=___value");
}
var aa=11;
Test();
WScript.Echo(aa);//22
function Test()
{
var aa=33;
WScript.Echo(get_global_var("aa"));//11
set_global_var("aa",22);
WScript.Echo(get_global_var("aa"));//22
WScript.Echo(aa);//33
}

在上面的例子中this从来就没有指过Test,而一直都是WScript的实例。
如果我们写一个语句:var test = new Test(); 这时Test里的this就是指的Test的一个实例了,这个实例中如果要使用Global的变量,Lostinet给出的是一个方法。
不过最简单还是把global传入对象,这样定义Test:


代码如下:

function Test(global)
{
// ...
}

然后这样创建实例:var test = new Test(this); 就可以在Test实例中使用global的对象和属性了。
是不是这样,在new的实例中,this就指实例,否则都指WScript?如果这样的话,换了脚本引擎,是不是情况又会不同?这个是标准吗?
new constructor[(arguments)];
new 运算符执行下面的任务:
·创建一个没有成员的对象。
·为那个对象调用构造函数,传递一个指针给新创建的对象作为 this 指针。
·然后构造函数根据传递给它的参数初始化该对象。
要注意的是即使当前作用域内没有调用new,但可能在其父作用域里是调用了new的,所以“在new的实例中,this就指实例,否则都指WScript?”,前半句对,而后半句不一定。

(0)

相关推荐

  • 浅谈JavaScript中定义变量时有无var声明的区别

    前段时间回答了一个关于定义变量时使用关键字var与否的区别,总结回顾一下. 1.在函数作用域内 加var定义的变量是局部变量,不加var定义的就成了全局变量. 使用var定义: var a = 'hello World'; function bb(){ var a = 'hello Bill'; console.log(a); } bb() //'hello Bill' console.log(a); //'hello world' 不使用var定义: var a = 'hello World'

  • JavaScript中变量声明有var和没var的区别示例介绍

    本文来论述JavaScript中变量声明有var和没var的区别,关于Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 (function(){ // ... })(); 在函数内部,有var和没var声明的变量是不一样的.有var声明的是局部变量,没var的,声明的全局变量,所以可以借此向外暴露接口东东. 在全局作用域内声明变量时,有var 和没var看起来都一样,我们知道,声明的全局变量,就是window的属性,究竟是否一样,我们通过ECMAScrpit5提供

  • javascript定义变量时有var和没有var的区别探讨

    我们先来看一段代码 function show(){ alert(abc); } var abc="defg"; show(); 有过C++或Java编程经验的人可能会说:"这程序,死定了,变量竟然在引用了该变量的函数后边定义,bug会灭掉你的."放在浏览器上运行一下,结果怎样?完美运行!接下来我们就说一下这是咋回事--有var和没有var定义的变量的区别. 1.没有var 简明的说,定义变量时省略var是不安全的,不过是合法的.这时无论该变量是在什么位置定义的,解

  • Javascript var变量隐式声明方法

    诸如此类.这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于"隐式"声明了一个变量y,在实际编程过程中,这种错误有时比较难以发现. 除此之外,今天通过同事介绍,了解到这种"隐式声明"中的别外一个问题. 当你在当前上下文内进行这种"隐式"声明时,JavaScript引擎会先在当前上下文中寻找是否之前有声明此变量,如果没有,再到上一级的上下文中去寻找,如果一直未找到,会最后在w

  • javascript定义变量时带var与不带var的区别分析

    本文实例分析了javascript定义变量时带var与不带var的区别.分享给大家供大家参考.具体分析如下: 直接看实例里说明: 复制代码 代码如下: <script language="javascript" type="text/javascript"> var abc=89;//带var,表示全局变量 function test(){  var abc=80;//在函数内部,如果不带var,表示使用函数外全局变量:带上var,表示新定义一个全局变量

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

    只要是写过点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编译

  • javascript中var的重要性分析

    本文实例分析了javascript中var的重要性.分享给大家供大家参考.具体分析如下: javascript 的 var 作用是声明变量. 一般情况下不写都不会出错,但有些情况如果不写,会有不同的结果.先看下面的示例: <div id="a"></div> <script type="text/javascript"> a = 1; alert(a); </script> 上面这个例子在FF Chrome执行不会有问

  • JavaScript声明变量时为什么要加var关键字

    在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它. 复制代码 代码如下: var x = "XX"; y ="xxx"; 诸如此类.这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于"隐式"声明了一个变量y,在实际编程过程中,这种错误有时比较难以发现. 当你在当前上下文内进行这种"隐式&

  • javascript定义变量时加var与不加var的区别

    一.外部的为全局,内部的为局部变量. 二.加var为局部变量(在方法内),不加var为全局变量(当方法内有一次使用后) 复制代码 代码如下: <script type="text/javascript"> var golbe="global"; test(); function test(){      var local="local";     document.write(golbe);     document.write(l

  • var与Javascript变量隐式声明

    var x = "XX"; y ="xxx"; 诸如此类.这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于"隐式"声明了一个变量y,在实际编程过程中,这种错误有时比较难以发现. 除此之外,今天通过同事介绍,了解到这种"隐式声明"中的别外一个问题. 当你在当前上下文内进行这种"隐式"声明时,JavaScript引擎会先在当前上下文中寻

随机推荐