日期:2014-05-18  浏览次数:20771 次

初学JS,又不懂之处,求教各位!谢谢 ,,,

想想,学1天了 ... 却还是问题不断 ... 

首先请看这个代码

<html>
<body>
<meta http-equiv="content-type" content="text/html;charset=GB2312" >
<script language="javascript">
<!--
var y = "global" ;
function fun(){
var y = "nihao" ;
return new Function("return y");
}
alert(fun());
-->
</script>
</body>
</html>


结果如下 :

这个结果,显然不是我想要的!!!

于是,我将代码进行了一点点的改动,把alert(fun())改成了alert(fun()());

结果,正确了,如下 :


由于初学JS才1天,不太理解这匿名函数的规矩,所以:

问题1 : 请帮我解释下上面出现这情况的原因 ?

问题2:麻烦各位解释下匿名函数的规矩!

注:重点是解决 问题1  !!!
谢谢

------解决方案--------------------
1,因为你alert的对象是个function,就像你alert一个对象一个,弹出的是个Object.
2, 匿名函数,就声明的函数没有名字,
像 var fn = function(){}; 这样就是把一个匿名函数赋值给了一个变量
至于规矩,我不太清楚,这个也没声明特别规矩把,反正‘一些事情需要马上执行,不想声明一个函数,再调用,就可以用一个匿名函数
如 $("#img_d").click(function (){alert()});

就像这样, var v = 1; alert(v); 和 直接alert(1),看你喜欢那种,
 
------解决方案--------------------
1,怎么会是死循环呢?dwn(add(5)(10)(20)(500)(500)); 
add(5)执行完,返回一个函数 (10)执行 。。。直到 最后一个函数(500),这时返回一个函数,也就是dwn函数的参数,就执行完了。
                var ret = function(a){
                    return add(a, s);
                } 这个并不像是java的递归,它只是申明一个函数。
2,       ret.valueOf = ret.toString = function(){
return s;
       } 
这里相当于java的重写toString()方法。如果你去掉这个代码,当然是输出那个函数本身。这个和你帖子一样。
ret.valueOf = ret.toString = s ;这样的话,你把一个int型的 变量赋值给了一个函数,
当然不行,ret.valueOf = ret.toString都是一个函数,你必须给它赋值一个函数

------解决方案--------------------
ret也是个function啊,你用一个数字变量赋值给一个function,怎么能行?
------解决方案--------------------
建议楼主先找本书,系统地学完(重要地运行例子代码,不断地问自己问题),再看是不是需要问这些问题!
还有,了解html文件,javascript执行顺序也同样很重要
------解决方案--------------------
不管什么语言,你起码要弄清楚new的目的是什么。公司招聘一个新人,和让新人干活,是两个步骤。招聘了新人,不一定就等于新人吧任务都完成了,你还要告诉他,去做什么,他才会返回结果。招聘的结果,是得到这个人,分配任务的结果,是得到你想要的结果。
于是 new Function("return y")只是得到了这个一个函数对象,就是招聘到的人。
return new Function("return y")返回的就是这个函数对象而已,但是它并没有执行。
return (new Function("return y"))();
这样把它作为一个函数对象 后面加()调用,也就是让其执行,才能达到效果。知其然,知其所以然,然后得道也。
------解决方案--------------------
另外,初学建议学点实用的例子 这些花花的代码一点用处都没暂时对你来说。