javascript中使用var定义变量的预编译效果

首先说明一点:javascript语法是非常灵活的,灵活的代价就是很容易导致不规范的编码和各种意想不到的运行结果。ECMAScript 5 引入了 严格模式 (strict mode),今后我们编写javascript代码最好都使用"use strict",规范我们的javascript代码。下面的测试代码不是基于严格模式。

alert(a);
var a;//已声明未赋值
alert(b);//未声明的变量

执行结果是:a打印undefined,b报错。这说明:var a;这条语句的执行在alert(a)之前。

alert(c);
var c = 1;
alert(c);

执行结果:先打印undefined,后打印1。实际上只是把声明提前了,但是赋值语句仍然没有改变位置

alert(a);
a = 1;

执行结果:代码报错。可见没有var关键字,变量的声明不会提前,没有”预编译”的过程。

function TestClass() {
    //没有使用var关键字定义的是全局变量
    val = 1;
    alert(val);
    //全局变量会存放在window对象中
    alert(window.val);

};
//调用TestClass构造函数
test = new TestClass();
//再次验证是一个全局变量
alert(val);

没有用var,其实是定义了一个全局变量,会放在window对象中。

function TestClass() {
    val = 1;
    alert(val);//1
    alert(window.val);//undefined

    var val = 10;
    alert(val);//10
    alert(window.val);//undefined
}

var test = new TestClass();

alert(val);//js报错,变量为定义

由此可见:使用var定义变量,变量声明会被提前,但是赋值不会提前.

时间: 2024-08-28 05:31:52

javascript中使用var定义变量的预编译效果的相关文章

javascript中字符串和字符串变量的问题

var s = new String("hello"); s.indexOf(1) = 'p'; //错误,indexof()是函数 s[1]='p' //错误,在c和c++可以改变字符串变量元素的值,但这里貌似有问题 alert(s); //显示“hello” var s = new String("Visit Microsoft!") var a=s.replace(/Microsoft/, "W3School") alert(a); ale

[C/C++]在头文件中使用static定义变量意味着什么

文章出处:http://www.cnblogs.com/zplutor/ 看到有一位同学在头文件中这么写: 1 static const wchar_t* g_str1 = - 2 static const wchar_t* g_str2 = - 这种定义变量的方式我从来没有见过,而且它还能顺利通过编译,于是我很想知道编译器是如何处理这种变量定义的. 定义全局变量时使用static,意味着该变量的作用域只限于定义它的源文件中,其它源文件不能访问.既然这种定义方式出现在头文件中,那么可以很自然地推

测试mysql的sql语句预编译效果

玩Oracle的都比较关注shared pool,特别是library cache,在使用了绑定变量(预编译sql)之后确实能得到很大的性能提升.现在在转Mysql之后特别是innodb很多东西都还能和Oracle对得上号的,就像innodb_buffer_pool_size类似于Oracle的database buffer cache,innodb_log_buffer_size类似于redo log buffer,但是innodb_additional_mem_pool_size仅仅类似于s

javascript中两种定义函数方式的差别以及函数的预编译效果

我们知道在javascript中定义函数的方式有以下两种: function mm(){ } 这种形式是声明一个函数,跟 var 声明一个变量机制一样,脚本在解释执行之前会做预编译处理. var mm = function(){ } 这种形式是对一个变量赋值,虽然也做预编译,但仅仅只是给 mm 事先变量分配一个内存空间,而没有做初始化. 代码1: alert(a);//打印函数a的内存 alert(b);//undefined alert(c);//JS报错:"c"未定义 functi

ts和js中let和var定义变量的区别

javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是"JavaScript 严格模式",比如下述的代码运行就会报错: let hello = 'hello world.'; console.log(hello); 错误信息如下: let hello = 'hello world.'; ^^^ SyntaxError: Block-scoped declarations (let, const, function, class) not yet sup

关于Javascript中通过var关键字声明变量和function关键字声明函数的笔记

一.概念 1.变量声明 在JavaScript中,变量一般通过var关键字(隐式声明,let关键字声明除外)进行声明,如下通过var关键字声明a,b,c三个变量(并给其中的a赋值): var a=1,b,c; //关键字显式声明变量a,b,c,并给a赋值console.log(a); //1 //由于b,c未定义变量类型,因此输出"undefined"console.log(b); //undefinedconsole.log(c); //undefined //如果变量未声明,则输出

js中let和var定义变量的区别

let变量之前没见过,刚遇到,探探究竟. 以下转自:http://blog.csdn.net/nfer_zhuang/article/details/48781671 声明后未赋值,表现相同 (function() { var varTest; let letTest; console.log(varTest); //输出undefined console.log(letTest); //输出undefined }()); 使用未声明的变量,表现不同: (function() { console

javascript中函数声明、变量声明以及变量赋值之间的关系与影响

函数声明.变量声明以及变量赋值之间有以下几点共识: 1.所有的全局变量都是window的属性 2.函数声明被提升到范围作用域的顶端 3.变量声明被提升到范围作用域的顶端 4.变量声明比函数声明的优先级高,变量声明优先于函数声明被提升,如果两者同名同时存在,后被提升的函数声明会覆盖先被提升的变量声明 5.变量赋值不会被提升,到执行行代码才开始赋值 补充: 6.调用javascript函数的整个过程可以分为预编译期(也叫声明期)和赋值期(也叫计算执行期). 预编译期完成对所有变量(包括形参.函数内部

javascript中的var关键字中的文章

javascript在声明变量时忽略var关键字是完全合法的.JavaScript作为弱类型(loosely-typed)的语言,不声明变量类型貌似是可以理解的,但是事实不是这么的直白,因为变量的属性除了类型外,还有作用域.下面举例说明: no.1 <script language="javascript"> var a = 0; document.write(a + '<br>'); var b = 1; function foo() { document.w