浏览 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();
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-08-31
func(); //执行func这个函数
var a = 0; //定义全局变量a
function func(){
alert(a); //打出undefined因为你在执行func后定义的a
var a; //定义个局部变量a
}
|
|
| 返回顶楼 | |
|
最后更新时间: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中的宏,有点儿怕怕的感觉。 闭包根宏怎么象了? |
|
| 返回顶楼 | |
|
最后更新时间:2007-08-31
延伸出来的一种情况,局部变量的优先级高于全局变量,而且局部变量在整个函数都是有效的,只是刚开始是undefined
var a = 0;
func();
function func() {
alert(a);
var a = 1;
}
|
|
| 返回顶楼 | |
|
最后更新时间: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";
}
|
|
| 返回顶楼 | |
|
最后更新时间: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); // 此处它具有一个值
}
|
|
| 返回顶楼 | |
|
最后更新时间:2007-08-31
查了一下,这好像是一个预编译过程导致的。
在javascript代码执行前,有个预编译过程(应该不会编译成中间语言,只是记忆一下)。 同一个scope里面如果有变量定义,函数定义,变量赋值。 不管代码顺序如何,总是先把函数定义房子最前面,然后是变量定义,最后是变量赋值。 var a = 'hello' 要把它拆分为变量定义和变量赋值两部分。 好像应该是这个样子了。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-09-01
weiqingfei 写道 再试试下面这段代码。
func();
function func(){
alert(a);
var a="hello";
}
undeinded呀,难道我没有说清楚?上面的代码相当于:
func();
function func(){
var a;
alert(a);
a="hello";
}
|
|
| 返回顶楼 | |








