一全局变量

是js运行的全局环境,定义全局变量其实就是在为window添加属性。定义全局变量的三种方式: 

1、简单点,<script>下直接var a;

2、直接地,window.a;

3、如果没有使用var关键字来声明的话,那这个变量必须位于使用之前就赋值,也会作为全局变量添加到window对象中。代码如下:

(function() {    
     if (true) {  
     		alert(h());     //不会执行成功,因为无var声明必须位于使用之前赋值
                h = function() {return false;}; 
      } 
     alert(h());  

 })();

所以,尽管平时我们定义变量可以省略var,但是易出现意想不到的情况。所以先声明后使用,好习惯!

千万要注意,不使用var不一定就是全局变量了,因为遇到的情况可能是变量声明提升

如代码:


  1. alert(b);
  2. alert("成功了!");


变量b前后都没声明,那么不会执行成功,不会弹出警告框,并且后面的语句也不会执行。但如果在调用变量之后补充了声明,那么就弹出警告,并且会顺利执行,如:

  1. alert(b);//返回undefined
  2. var b='kk';
  3. alert(b);//返回kk


虽然之前没有声明变量,但随后进行了声明,那么JavaScript执行器会将所有的变量声明一道语句顶部,这就是变量声明提升。

如果是在函数内声明局部变量,那么就会将变量声明提升到函数体内的最顶部,不会被当作全局变量了。千万注意以下3点:

1、如果全局变量和变量声明提升同时存在,则在变量声明提升作用域内,变量声明提升占主。如下面代码:

w=9;
function foo() {
    alert(w);	//undefined
    var w;		//undefined
    alert(w);
}
foo();
alert(w);		//9

2、要注意,变量声明提升的对象不要是DOM对象


  1. alert(event); //IE,FF,CH,OP返回undefined,而不是中断执行


3、条件语句特别注意。 

代码1:

f = function() {return true;}; 		//函数可以这样申明,变量也可以,但必须都赋值且位于使用之前
    g = function() {return false;};
   (function() {  
 	  if (g() && [] !== [] ) {  	       //除了FF,判断语句调用条件块内声明的变量或函数,也会造成变量提升,提升到与条件语句块同级。
     		 f = function() {return false;};   
   	  	 function g() {return true;}  
  		 } 
	 alert(f());	//FF:true、Other:false
         alert(g());    //FF:false、other:true

   })();  

alert(f());        //FF:true、Other:false
alert(g());        //false

代码2:

if (!("a" in window)) {      //提升到与if同级的window作用域
    var a = 1;
}

alert(a);     //undeinfed

代码3:

alert(typeof foo); // "undefined",函数声明也被提升了,不是当成全局变量

var foo = function () {
    // body...
};

代码4:

function test() {
    alert("1");
}

test();

function test() {
    alert("2");
}

test();

两次都是2,所以直接使用alert好过定义相同函数。






二、this

在js中,this引用的是函数据以执行操作的对象,也就是函数在执行时所处的作用域。