论坛首页 AJAX版 JavaScript

javascript是按照怎样的顺序解析执行的?

浏览 1113 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-08-31
下面这段代码把我搞糊涂了
	func();
	var a = 0;
	function func(){
		alert(a);
		var a;
	}


另外,闭包怎么看都像c中的宏,有点儿怕怕的感觉。
	function createFunc(list){
		var fl = [];
		for(var i=0; i<list.length; i++)
		{
			fl.push(function(){alert(i+","+list[i]);});
		}
		return fl;
	}
	function runFuncList(){
		var list = [1,2,3];
		var fl = createFunc(list);
		for(var i=0; i<fl.length; i++)
		{
			fl[i]();
		}
	}
	runFuncList();
   
最后更新时间:2007-08-31
func(); //执行func这个函数 
var a = 0;   //定义全局变量a
function func(){   
    alert(a);   //打出undefined因为你在执行func后定义的a
    var a;   //定义个局部变量a
}   
  
   
0 请登录后投票
最后更新时间:2007-08-31
campaign 写道
func(); //执行func这个函数 
var a = 0;   //定义全局变量a
function func(){   
    alert(a);   //打出undefined因为你在执行func后定义的a
    var a;   //定义个局部变量a
}   
  



	var a = 0;   
	func(); 
 
  function func(){     
      alert(a);   
      var a;  
  }     
    


这样也是一样undefined。

原因是:
  function func(){     
      alert(a);   
      var a;  
  }   

在定义的时候,相当于:
  function func(){     
     var a;      
     alert(a);   
  
  }   


alert(a)的时候,a没有赋值。所以undeined。

也就是说javascript在函数定义的时候,会把函数的局部变量提到函数体前执行,然后才是执行相应的方法。象上面的。var a就覆盖了全局的var a,所以....


weiqingfei 写道

另外,闭包怎么看都像c中的宏,有点儿怕怕的感觉。

闭包根宏怎么象了?
   
0 请登录后投票
最后更新时间:2007-08-31
延伸出来的一种情况,局部变量的优先级高于全局变量,而且局部变量在整个函数都是有效的,只是刚开始是undefined

var a = 0;
func();
function func() {
	alert(a);
	var a = 1;
}
   
0 请登录后投票
最后更新时间:2007-08-31
dogstar 写道
campaign 写道
func(); //执行func这个函数 
var a = 0;   //定义全局变量a
function func(){   
    alert(a);   //打出undefined因为你在执行func后定义的a
    var a;   //定义个局部变量a
}   
  



	var a = 0;   
	func(); 
 
  function func(){     
      alert(a);   
      var a;  
  }     
    


这样也是一样undefined。

原因是:
  function func(){     
      alert(a);   
      var a;  
  }   

在定义的时候,相当于:
  function func(){     
     var a;      
     alert(a);   
  
  }   


alert(a)的时候,a没有赋值。所以undeined。

也就是说javascript在函数定义的时候,会把函数的局部变量提到函数体前执行,然后才是执行相应的方法。象上面的。var a就覆盖了全局的var a,所以....


再试试下面这段代码。
	func();
	function func(){
		alert(a);
		var a="hello";
	}
   
0 请登录后投票
最后更新时间:2007-08-31
突然想起来犀牛书上有一个经典的例子,抄过来大家看一下


和C、C++以及java不同,javascript中没有块级作用域,函数声明的所有变量,无论是在哪里声明的,在整个函数中它们都是有定义的。

var scrope = "global";
function f() {
 	alert(scrope);  			// 显示 “undefined”,而不是“global”
 	var scrope = "local";		// 此处是初始化变量,不过它在哪里都有定义
 	alert(scrope);  			// 显示 “global”
}
f();


局部变量在整个函数体内都是有定义的,这就意味着在整个函数体中都隐藏了同名的局部变量。而虽然局部变量在整个函数体中都是有定义的,但是在执行var 语句之前,它是不会被初始化的。因此上面代码的等价形式为:

function f() {
	var scope;			// 函数的开头声明了局部变量
	alert(scope);		// 此处它已经存在,但值仍为“undefined”
	scope = "local";	// 这里我们初始化它,给它赋一个值
	alert(scope);		// 此处它具有一个值 
}
   
0 请登录后投票
最后更新时间:2007-08-31
查了一下,这好像是一个预编译过程导致的。
在javascript代码执行前,有个预编译过程(应该不会编译成中间语言,只是记忆一下)。

同一个scope里面如果有变量定义,函数定义,变量赋值。
不管代码顺序如何,总是先把函数定义房子最前面,然后是变量定义,最后是变量赋值。
var a = 'hello'

要把它拆分为变量定义和变量赋值两部分。

好像应该是这个样子了。
   
0 请登录后投票
最后更新时间:2007-09-01
weiqingfei 写道


再试试下面这段代码。
	func();
	function func(){
		alert(a);
		var a="hello";
	}


undeinded呀,难道我没有说清楚?上面的代码相当于:
	func();
	function func(){
                var a;
		alert(a);
		a="hello";
	}
   
0 请登录后投票
论坛首页 AJAX版 JavaScript

跳转论坛:
JavaEye推荐