js变量

一、js变量

js标识符可以包含字母、下划线、美元符($)和数字,不能以数字开头;

使用关键字作为标识符在大多数浏览器会导致“Identifier Expected”(缺少标识符)错误,保留字则会看具体的浏览器是否会报错。所以也不要用关键字和保留字作为标识符。

js区分大小写,(如:y 和 Y 是不同的变量);
向变量分配文本值时,应该用双引号或单引号包围这个值;
向变量赋的值是数值时,不要使用引号;如果您用引号包围数值,该值会被作为文本来处理;

ECMAScript的变量是松散类型的。松散类型可以用来保存任何类型的数据;

1.变量必须声明才能引用,否则将会报错,错误位置后的代码将无法执行;
2.声明的变量,未初始化,值为"undefined";
3.一条语句可声明多个变量,语句以 var 开头,变量间以英文逗号分隔;

var pi=3.14;
var name="Bill Gates";
var name2="Gates", majorIn="致力于", job="数钱玩";
var car1 = "Porsche",
    car2 = "Rolls-Royce",
    car3 = "Maybach";
var name3;

document.write(pi + "</br>");//3.14
document.write(name + "</br>");//Bill Gates
document.write(name2 + " " + majorIn + " " + job + "</br>");//Gates 致力于 数钱玩
document.write(car1 + " " + car2 + " " + car3 + "</br>");//Porsche Rolls-Royce Maybach
document.write(name3 + "</br>");//undefined
document.write(name4 + "</br>");//Uncaught ReferenceError: name4 is not defined
document.write("~~~~~~~~~~~·····我没执行啊啊啊啊啊啊");

二、变量作用域

1.全局变量和局部变量

//函数调用js变量
var a = 1;
function test1(){
  document.write(a + "<br>");
}
test1();//1

//变量前有var的为局部变量,全局变量前无var
b = 1;
function test2(){
  var b = 2;
  document.write(b + "、");
}
test2();
document.write(b + "<br>");//2、1

var c = 1;
function test3(){
  c = 2;
  document.write(c + "、");
}
test3();
document.write(c + "<br>");//2、2


var d = 1;
function test4(){
  var d = 2;
  document.write(d + "、");
}
test4();
document.write(d + "<br>");//2、1


e = 1;
function test5(){
  e = 2;
  document.write(e + "、");
}
test5();
document.write(e + "<br>");//2、2

变量前有var的为局部变量,全局变量前无var;

var f = 1;
function test6(){
  document.write(f + "、");
  var f = 2;
  document.write(f + "、");
}
test6();
document.write(f + "<br>");//undefined、2、1
Javascript在执行前,会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定变量的作用域; 所以test6()内第一行执行的局部变量f为undefined;

隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力。

  • 通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。
  • 无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。
// 定义三个全局变量
var global_var = 1;
global_novar = 2; // 反面教材
(function () {
   global_fromfunc = 3; // 反面教材
}());

// 试图删除
delete global_var; // false
delete global_novar; // true
delete global_fromfunc; // true

// 测试该删除
typeof global_var; // "number"
typeof global_novar; // "undefined"
typeof global_fromfunc; // "undefined"

以下内容转自:CSDN刀刀的专栏 ,哈哈他是转自http://apps.hi.baidu.com/share/detail/50528730目前已失效。

下面所有内容概括来就三个结论:

1.Javascript变量的作用域是函数而不是for、while、if等代码块;

2.Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定变量的作用域;

3.当全局变量跟局部变量同名时,局部变量的作用域会覆盖掉全局变量的作用域,当离开局部变量的作用域后,又重回到全局变量的作用域;

function test(){
  var a;
  document.write("结果为:" + a + "、");
  a = "World";
  document.write(a);
}
test();

结果为:undefined、World

var a = "Hello";
function test1(){
  document.write("结果为:" + a + "、");
  a = "World";
  document.write(a);
}
test1();

结果为:Hello、World

此两个例子:当全局变量与局部变量同名时,局部变量的作用域将覆盖全局变量的作用域;

var a = 1;
function test2(){
  document.write("结果为:" + a + "、");
  var a = 2;
  document.write(a + "、");
}
test2();
document.write(a);

结果为:undefined、2、1;可能我们普遍觉得局部变量作用域覆盖全局变量作用域,应该是1、2、1,那么既然感到好奇就往下看吧。

一、Javascript变量的作用域是函数,而不是for、while、if等代码块;

function test3(){
  document.write("before for scope:" + i + "<br>");// i未赋值(并不是未声明!使用未声明的变量或函数全抛出致命错误而中断脚本执行)
                                                // 此时i的值是underfined
  for(var i=0;i<3;i++){
    document.write("in for scope:"+i + "<br>");// i的值是 0、1、2, 当i为3时跳出循环
  }
  document.write("after for scope:"+i + "<br>");  // i的值是3,注意,此时已经在for scope以外,但i的值仍然保留为3
    
  while(true){
    var j = 1;
    break;
  }
  document.write("j:" + j + "<br>");// j的值是1,注意,此时已经在while scope以外,但j的值仍然保留为1

  if(true){
    var k = 1;
  }
  document.write("k:" + k);//k的值是1,注意,此时已经在if scope以外,但k的值仍然保留为1
}

test3();
//若在此时(function scope之外)再输出只存在于test3 这个function scope里的 i、j、k变量会发生神马效果呢?
document.write(i); //error! 没错,是error,原因是变量i未声明(并不是未赋值,区分test2函数的第一行输出),导致脚本错误,程序到此结束!
document.write("这行打印还会输出吗?"); //未执行
document.write(j); //未执行
document.write(k); //未执行

输出结果为:

in for scope:0
in for scope:1
in for scope:2
after for scope:3
j:1
k:1

test3()方法后的i,j,k并未输出,因为它们都是局部变量;

二、Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定变量的作用域;

var a =1;
function test4(){
  document.write("运行结果:" + a + '、');//a为undefined! 这个a并不是全局变量,这是因为在function scope里已经声明了(函数体倒数第4行)一个重名的局部变量,
      //所以全局变量a被覆盖了,这说明了Javascript在执行前会对整个脚本文件的定义部分做完整分析,所以在函数test()执行前,
      //函数体中的变量a就被指向内部的局部变量.而不是指向外部的全局变量. 但这时a只有声明,还没赋值,所以输出undefined。
  a=4;       
  document.write(a + '、');//a为4,没悬念了吧? 这里的a还是局部变量哦!
  var a;//局部变量a在这行声明
  document.write(a + '、');//a还是为4,这是因为之前已把4赋给a了
}

test4();
document.write(a);//a为1,这里并不在function scope内,a的值为全局变量的值

运行结果:undefined、4、4、1

三、当全局变量跟局部变量同名时,局部变量的作用域会覆盖掉全局变量的作用域,当离开局部变量的作用域后,又重回到全局变量的作用域;

var a = 1;
function test5(){   
  document.write("运行结果:" + window.a + "、");//a为1,这里的a是全局变量哦!
  document.write(a + "、");
  var a = 2;//局部变量a在这行定义
  document.write(a + "、");//a为2,这里的a是局部变量哦!
}

test5();
document.write(a);//a为1,这里并不在function scope内,a的值为全局变量的



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值