JavaScript中的关键字"VAR"使用祥解

javascript|关键字

  都不记得是什么时候看的JScript的语法教程了,里面说在声明变量时忽略var关键字是完全合法的。当时也因为觉得JavaScript是loosely-typed的语言,所以var可能真的就是个摆设。但是事实常常又证明想当然的结果是不可靠的。

    看看下面这几个例子的结果就知道问题了:

    No.1

<script language="javascript">
var var00 = 0;
document.write(var00 + '<br>');var var01 = 1;
function foo()
{
    document.write(var01);
    var var01 = 1;
}
foo();
</script>

    No.2

<script language="javascript">
var00 = 0;
document.write(var00 + '<br>');var01 = 1;
function foo()
{
    document.write(var01);
    var01 = 1;
}
foo();
</script>

    No.3

<script language="javascript">
var00 = 0;
document.write(var00 + '<br>');var01 = 1;
function foo()
{
    document.write(var01);
    var var01 = 1;
}
foo();
</script>

    这三个例子的执行结果分别是:

Results#region Results
No.1
0
undefinedNo.2
0
1No.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。

    By the way, 重看JScript教程时,它说变量只能是[a-zA-Z_]+[a-zA-Z0-9_]*格式,可是'$'却也可以作为变量名字符,而且还可以用在开头,比如:$1234,更甚至于:$$$ 也是合法的变量名,faint。

<script type="text/javascript">
<!--
//这样写js的语句块更好一些:)
-->
</script>

  我想知道是不是.在调用一个函数时,程序执行顺序会先检查函数内部变量中,有没有关键字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?”,前半句对,而后半句不一定。

时间: 2024-09-20 16:50:20

JavaScript中的关键字"VAR"使用祥解的相关文章

JavaScript中的关键字&amp;quot;VAR&amp;quot;使用详解 分享_基础知识

看看下面这几个例子的结果就知道问题了:这三个例子的执行结果分别是: 复制代码 代码如下: Results#region ResultsNo.10undefinedNo.201No.30undefined#endregion 原来JavaScript的变量也是有作用域的,只是它非常的笼统,就分为全局变量和函数变量.在第二个例子中得到0和1,是因为所有的变量都是全局变量,而且那个语句块一共就定义了两个变量.而第一个第三的函数外全局变量,确实说明var关键字有没有都没有关系.而函数内的var关键字就很

JavaScript中this关键字使用方法详解

javascript|关键字|详解 在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的.JavaScript也提供了这个this关键字,不过用起来就比经典OO语言中要"混乱"的多了.     下面就来看看,在JavaScript中各种this的使用方法有什么混乱之处?     1.在HTML元素事件属性中inline方式使用this关键字:  <div

Javascript中的关键字和保留字整理_基础知识

ECMA-262中描述了一组具有特定用途的关键字,可用于表示控制语句的开始或结束,或者用于执行特定操作等.规定:关键字属于语言保留,不可以用于标示符. ECMAScript的全部关键字(*为第五版新增): break do instanceof typeof case else new var catch finally return void continue for switch while debugger*   function this with default if throw de

JavaScript中变量声明有var和没var的区别

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

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

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

Java中volatile关键字的作用与用法详解_java

volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile 关键字作用是,使系统中所有线程对该关键字修饰的变量共享可见,可以禁止线程的工作内存对volatile修饰的变量进行缓存. volatile 2个使用场景: 1.可见性:Java提供了volatile关键字来保证可见性. 当一个共享变量被volatile修饰时,它会保证修

Javascript中this关键字详解

Quiz 请看下面的代码,最后alert出来的是什么呢? 1 var name = "Bob"; 2 var nameObj ={ 3 name : "Tom", 4 showName : function(){ 5 alert(this.name); 6 }, 7 waitShowName : function(){ 8 setTimeout(this.showName, 1000); 9 } 10 }; 11 12 nameObj.waitShowName();

javascript中new关键字详解_基础知识

和其他高级语言一样javascript中也有new关键字,我们以前认知的new是用来创建一个类的实例对象,但在js中万物皆是对象,为何还要new关键字呢,其实js中new关键字不是用来创建一个类的实例对象,而是用于继承. 接下来,本文将带你一起来探索JS中new的奥秘... function Animal(name){ this.name = name; } Animal.color = "black"; Animal.prototype.say = function(){ conso

javascript中this关键字详解_javascript技巧

不管学习什么知识,习惯于把自己所学习的知识列成一个list,会有助于我们理清思路,是一个很好的学习方法.强烈推荐. 以下篇幅有点长,希望读者耐心阅读. 以下内容会分为如下部分: 1.涵义 1.1:this涵义 1.2:this指向的可变性 2.使用场合 2.1:全局环境 2.2:构造函数 2.3:对象的方法 3.使用注意点 3.1:避免多层嵌套this 3.2:避免数组处理方法中的this 3.3:避免回调函数中的this 1.涵义 1.1:this涵义 在我写的一篇关于 构造函数与new关键字

Javascript中关于Array.filter()的妙用详解_javascript技巧

前言 和map类似,Array的filter也接收一个函数.但是和map不同的是, filter把传入的函数依次作用于每个元素,然后根据返回值是 true 还是false决定保留还是丢弃该元素. 实例介绍 例如,在一个Array中,删掉偶数,只保留奇数,可以这么写: var arr = [1, 2, 4, 5, 6, 9, 10, 15]; var r = arr.filter(function (x) { return x % 2 !== 0; }); r; // [1, 5, 9, 15]