<script type="text/javascript">
//变量作用域
//情形1:
// var a =1;
// function test(){
// var a =2;//局部变量
// alert(a);//l临近原则弹出2
// }
// test();
// alert(a);//全部变量并未改变还是1
//情形2:
// var a=1;
// function test(){
// alert(a);//弹出undefined,虽然test上方声明并赋值了a,但是位于alert下,a变量被提升,输出值声明但未赋值,所以弹出undefined
// var a =10;
// }
// test();
//情形3:
// var a = 1;
// function test(){
// alert(a); //输出1全局变量还未改变
// a=10;
// }
// test();
// alert(a);//全局变量被重新赋值为10
//情形四:
// function test(){
// alert(a); //弹出未定义,由此可看出js是认为a声明了只是未赋值(即变量提升功能),如果去掉var a=10下面那句则直接报错a is not defined,可以用来解释情形2
// var a =10;
// }
// test();
//let(ECMASCRIPT6)和var的区别
//情形1:
// let a=1;
// function test(){
// alert(a); //程序直接报错崩溃(a is not defined),不像var 一样只是弹出undefined值,说明let不存在变量提升功能(var才有)
//alert(b);//弹出undefined
// let a = "helloworld";
// var b="ss";
// }
// test();
//情形2:
// function test(){
// var a =1;
// var a=5;
// let b=2;
// let b=4;//报错Identifier 'b' has already been declared,说明用let声明变量,同一个变量不能重复声明,而var则没有问题
// }
// test();
//情形3:
// var a=1;
// function test(){
// var a=10;//此时属于声明一个局部变量a,并未改变全部变量a的值
// }
// alert(a);//弹出1
//情形4:
// function test(){
// var a = 1;
// let b = 2;
// {
// var a = 10;
// let b = 5;
// }
// alert(a);//10 覆盖了代码块外的变量a
// alert(b);//2 没有覆盖代码块外的b
// }
// test();
//This指向N种情况
//情况1:
//this test()作为普通函数此时this指向window
// function test(){
// this.r=1;
// alert(this);
// }
// test();
//情况2:
//test对象,此时this指向当前对象this
// var test={
// name:"jack",
// fn:function(){
// this.x=5;alert(this)
// }
// }
// test.fn();
//情况3:
// var obj ={
// name:'tom',
// getName:function(){
// return this.name
// }
// };
// var getN=obj.getName; //将obj对象中的getName方法赋值给变量,此时方法中的this不再指向obj对象,而是指向window对象
// alert(getN());
//情况4:
//this指向window
// function test(){
// this.r=5;
// alert(this);
// }
// function t(){
// test();
// }
// t();
//情况5:
// function test(){
// alert(this);
// }
// //此时this指向当前对象a
// var a = new test();
</script>
//变量作用域
//情形1:
// var a =1;
// function test(){
// var a =2;//局部变量
// alert(a);//l临近原则弹出2
// }
// test();
// alert(a);//全部变量并未改变还是1
//情形2:
// var a=1;
// function test(){
// alert(a);//弹出undefined,虽然test上方声明并赋值了a,但是位于alert下,a变量被提升,输出值声明但未赋值,所以弹出undefined
// var a =10;
// }
// test();
//情形3:
// var a = 1;
// function test(){
// alert(a); //输出1全局变量还未改变
// a=10;
// }
// test();
// alert(a);//全局变量被重新赋值为10
//情形四:
// function test(){
// alert(a); //弹出未定义,由此可看出js是认为a声明了只是未赋值(即变量提升功能),如果去掉var a=10下面那句则直接报错a is not defined,可以用来解释情形2
// var a =10;
// }
// test();
//let(ECMASCRIPT6)和var的区别
//情形1:
// let a=1;
// function test(){
// alert(a); //程序直接报错崩溃(a is not defined),不像var 一样只是弹出undefined值,说明let不存在变量提升功能(var才有)
//alert(b);//弹出undefined
// let a = "helloworld";
// var b="ss";
// }
// test();
//情形2:
// function test(){
// var a =1;
// var a=5;
// let b=2;
// let b=4;//报错Identifier 'b' has already been declared,说明用let声明变量,同一个变量不能重复声明,而var则没有问题
// }
// test();
//情形3:
// var a=1;
// function test(){
// var a=10;//此时属于声明一个局部变量a,并未改变全部变量a的值
// }
// alert(a);//弹出1
//情形4:
// function test(){
// var a = 1;
// let b = 2;
// {
// var a = 10;
// let b = 5;
// }
// alert(a);//10 覆盖了代码块外的变量a
// alert(b);//2 没有覆盖代码块外的b
// }
// test();
//This指向N种情况
//情况1:
//this test()作为普通函数此时this指向window
// function test(){
// this.r=1;
// alert(this);
// }
// test();
//情况2:
//test对象,此时this指向当前对象this
// var test={
// name:"jack",
// fn:function(){
// this.x=5;alert(this)
// }
// }
// test.fn();
//情况3:
// var obj ={
// name:'tom',
// getName:function(){
// return this.name
// }
// };
// var getN=obj.getName; //将obj对象中的getName方法赋值给变量,此时方法中的this不再指向obj对象,而是指向window对象
// alert(getN());
//情况4:
//this指向window
// function test(){
// this.r=5;
// alert(this);
// }
// function t(){
// test();
// }
// t();
//情况5:
// function test(){
// alert(this);
// }
// //此时this指向当前对象a
// var a = new test();
</script>