`
web001
  • 浏览: 96439 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

    博客分类:
  • Web
阅读更多

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


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

    No.1

 

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

 

 

    No.2

 

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

    No.3

 

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

 


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

 

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。

    By the way, 重看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?”,前半句对,而后半句不一定。
分享到:
评论

相关推荐

    javascript中new关键字详解

    和其他高级语言一样javascript中也有new关键字,我们以前认知的new是用来创建一个类的实例对象,但在js中万物皆是对象,为何还要new关键字呢,其实js中new关键字不是用来创建一个类的实例对象,而是用于继承。...

    JavaScript this 关键字

    JavaScript this 关键字 面向对象语言中 this 表示当前对象的一个引用。 但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。 在方法中,this 表示该方法所属的对象。 如果单独使用,this ...

    JavaScript中this关键字用法实例分析

    本文实例总结了JavaScript中this关键字用法。分享给大家供大家参考,具体如下: 例1: function a(){ var user = "yao"; console.log(this.user);//undefined console.log(this);//window } a(); 等价于: ...

    107个常用javascript语句

    13.JS中声明变量使用:var来进行声明 14.JS中的判断语句结构:if(condition){}else{} 15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop} 16.循环中止的命令是:break 17.JS...

    javascript函数的解释

    13.JS中声明变量使用:var来进行声明 14.JS中的判断语句结构:if(condition){}else{} 15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop} 16.循环中止的命令是:break 17.JS...

    浮点vfdsfJAVA实现链表,双向链表.txtJAVA实现链表,双向链表.txt

    * 点击上传资源即表示您确认该资源不违反资源分享的使用条款,并且您拥有该资源的所有版权或者上传资源的授权 &lt;!-- right area --&gt; &lt;div class="right"&gt; &lt;!-- hot Tag --&gt; ...

    js使用小技巧

    Javascript小技巧一箩筐 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode ...

    网页播放器代码(javascript 播放器 控制)

    发表:不详 阅读: 37 次 关键字:不详 字体:[大 中 小] 详细参数可查询MSDN http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmplay/mmp_sdk/settingsobject.asp &lt;!DOCTYPE ...

    搜索引擎名次查询.net版源码下载

    &lt;script LANGUAGE="JavaScript"&gt; function check()//表单判断 { var str=""; var j=0; var el=document.form1.getElementsByTagName("input") for(i=0;i;i++){ if(el[i].type=="checkbox"){ ...

    图库新版jQuery焦点图 JS代码

    var ojs='&lt;script type="text/javascript" src="http://cbjs.baidu.com/js/o.js"&gt;&lt;/script&gt;'; if (code=="top210x90_1"){ document.write('&lt;script type="text/javascript" &gt;BAIDU_CLB_SLOT_ID = "288992";&lt;/script&gt;...

    JavaScript的this关键字的理解

    换句话说,关键字this可在函数中使用,是对一个对象的引用,而函数正是该对象的属性或方法。 让我们来看这个对象: &lt;!DOCTYPE html&gt;&lt;html lang="en"&gt;&lt;body&gt;[removed] var cody = { living:true, ...

    javascript入门笔记

    3、不能使用JS中的关键字 和 保留关键字 4、变量名不能重复 5、可以采用"驼峰命名法",小驼峰命名法使用居多 6、最好见名知意 var a; var uname; 4、变量的使用 1、为变量赋值 - SET操作 只要变量出现在 ...

    jQuery详细教程

    某些其他 JavaScript 库中的函数(比如 Prototype)同样使用 $ 符号。 jQuery 使用名为 noConflict() 的方法来解决该问题。 var jq=jQuery.noConflict(),帮助您使用自己的名称(比如 jq)来代替 $ 符号。 亲自试一...

    正则表达式

    如果想在正则表达式中使用特殊的标点符号,必须在它们之前加上一个 "\" . 2.字符类 将单独的直接符放进中括号内就可以组合成字符类.一个字符类和它所包含的任何一个字符都匹配,所以正则表达式 / [abc] / 和字母 ...

    javascript函数大全

    javascript函数大全 91.document.write()不换行的输出,document.writeln()换行输出 92.document.body.noWrap=true;防止链接文字折行. 93....定义常量的关键字:const,定义变量的关键字:var

    JavaScript面向对象精要(下部)

    构造函数和原型对象 构造函数也是函数,用new创建对象时调用的函数,与普通函数的一个区别是,其首字母应该大写。...使用new时,会自动创建this对象,其类型为构造函数类型,指向对象实例;缺少new关键字,this指向全

    跟我学习javascript的this关键字

    本文仅就这一问题展开讨论,阅罢本文,读者若能正确回答 JavaScript 中的 What ‘s this 问题,作为作者,我就会觉得花费这么多功夫,撰写这样一篇文章是值得的。 我们要记住一句话:this永远指向函数运行时所在的...

    字符串内特殊字符在html_javascript_xml等内使用时的转换

    原来是javascript在提交数据时若遇到”\”会把它当做javascript的特殊字符对待(相当于关键字),从而打乱了javascript代码,导致错误.而我的pathname由于是绝对地址,包含了很多个”\”,所以报错。解决办法是将”\”替换...

    postcss-color-converter:PostCSS插件可在HEX,RGB,HSL和关键字颜色格式之间转换颜色

    postcss颜色转换器插件可在它们之间转换HEX,RGB,HSL和关键字颜色(无需转换为关键字颜色格式)。 使用引擎盖下的。 支持Sass(SCSS)(需要或 )和CSS变量。安装$ npm install postcss-color-converter用法// ...

Global site tag (gtag.js) - Google Analytics