一、js变量
js标识符可以包含字母、下划线、美元符($)和数字,不能以数字开头;
使用关键字作为标识符在大多数浏览器会导致“Identifier Expected”(缺少标识符)错误,保留字则会看具体的浏览器是否会报错。所以也不要用关键字和保留字作为标识符。
向变量赋的值是数值时,不要使用引号;如果您用引号包围数值,该值会被作为文本来处理;
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的值为全局变量的