javascript闭包问题

2025-03-04 04:05:13
推荐回答(3个)
回答1:

定义一个函数myFunction,使之赋值给y,即y = myFunction,此时y和myFunction其实是同一个对象,都是函数。就好像你是一个人,有一个大名,但是你还有一个小名。无论大名小名甚至以后再改名,你还是你。所以这里y和myFunction都只是一个名字,它们不是真正的对象,它们只是指向了同一个函数对象,它们只是名字不同,实质是一样的。

现在,你可以说y是一个函数,myFunction也是一个函数,它们都是函数。要调用一个函数,就要在这个函数名后面加上括号,有参数给参数,不需要参数就只给括号。函数后面一旦有了括号,它就会执行它的函数体,然后总会有一个返回值。所以,y()是执行了一个名字叫y的函数,这个函数的返回值,就是原来名字叫myFunction那个函数的返回值。但是这个函数貌似没有写返回值,不过它有一个默认的返回值,就是undefined。

因此,如果是y = myFunction(),实际上y是undefined,它就不是函数了,你也不能再当它是函数,然后用括号调用了。如果y是undefined,y()是错误的语法,不会有任何代码执行,只会报错。

这个问题的重点不是闭包或者不闭包,而是返回值,代码一的返回值是undefined,代码二的返回值是一个函数。

所以在代码二中,y = myFunction()返回的是close函数,这个你知道。但是修改成y = myFunction,其实不是你所说的无效,而是此时,y不再是myFunction的返回结果,而是给myFunction换了个名字。

至于弹出的结果,这个是另一个话题,它才是闭包范围内的问题。

回答2:

好多问题呀。

代码一

var y = myFunction;

y就是myFunction函数。是同一个东西。

var y = myFunction();

是先执行myFunction,然后把返回值给y。

代码二

var y = myFunction();

跟代码一里一样,所以拿的是myFunction的返回值,而myFunction的返回值在这里是close。

相当于

var y = close;

但是要注意的是close在函数myFunction里,同时,因为close调用了myFunction里的变量,导致函数中的临时变量不会释放。这就是闭包。

如果改成

var y = myFunction;

这时候运行

y();

相当于运行

myFunction();

而myFunction只是定义了x和close函数就返回close了,所以你看不到明显的效果。

回答3:

闭包的使用是为保持对某一作用域访问的。
节点onclick 事件触发时 执行function(e){alert(i);}。i指向function(nodes){}函数作用域里面的i。
事件是在 节点绑定函数之后才触发的。这时,i已经循环到nodes.length。i的值就是nodes.length。
为了避免这种情况的发生。
var add = function(nodes){
var i;
for(i=0; i< nodes.length; i+=1){
(function(e){
var that=i;
nodes[that].onclick =function(){
alert(that);
};
})(i);
}
};
直接执行函数 将 i 绑定到事件上。