js 匿名函数的问题

密码测试 2010-01-11 10:07:04
<script type="text/javascript">
var y = "global";
function factory() {
var y = "local";
return function(){return y;}; //第5行
//return new Function ("return y");//第6行
}
alert(factory()());
</script>
---------------------------------------------
上述代码会输出:local
如果把第5行注释掉,把第6行放开,那么输出:global
我想问问这是什么原因?这里有没有闭包的概念在里面?这两种
方式返回的都是匿名函数,它们的区别在哪里?请
各位大虾解答一下,谢谢!
...全文
131 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
密码测试 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yyangsy 的回复:]
呵呵,函数有三种写法,你知道么?

用Function()构造函数创建的函数不遵循典型的作用域,以顶级函数执行。
[/Quote]
能把这三种写法举例列举并简单说明一下么,在这里一起做个记号?十分感谢。
对JS的学习一直不系统,很多基础问题都不明白啊,惭愧:(
浴火_凤凰 2010-01-11
  • 打赏
  • 举报
回复
闭包害人啊
草根醉秋意 2010-01-11
  • 打赏
  • 举报
回复
通过调用 Function 构造函数创建的函数对象,其内部的 [[scope]] 属性引用的作用域链中始终只包含全局对象。

通过函数声明或函数表达式创建的函数对象,其内部的 [[scope]] 属性引用的则是创建它们的执行环境的作用域链。
yyangsy 2010-01-11
  • 打赏
  • 举报
回复
呵呵,函数有三种写法,你知道么?

用Function()构造函数创建的函数不遵循典型的作用域,以顶级函数执行。
yixianggao 2010-01-11
  • 打赏
  • 举报
回复
好意思,经试验发现俺上面的解释有些错误!
    var y = "global"; 
function factory() {
var y = "local";
//return function(){return y;}; //第5行
return (new Function ("return y"))();//第6行
}
alert(factory()); // global

以上代码显示 global,这个结果说明经 new Function 实例化的函数为全局函数,
其中的变量自然要从同级的作用域中查找,因此显示了全局 y 的 global。

顺便说句,lz 是有心人,这个问题俺以前真没注意过,
js 确实比较诡异,许多问题要通过试验来验证。
zm_hs 2010-01-11
  • 打赏
  • 举报
回复
学习!
yixianggao 2010-01-11
  • 打赏
  • 举报
回复
    var y = "global"; 
function factory() {
var y = "local";
return function(){return y;}; //第5行
//return new Function ("return y");//第6行
}
alert(factory()());

呵呵,第五行的确是闭包,匿名函数引用可了 factory 的局部变量 y,因此“local”得以显示!
再说第六行,跟闭包没有一毛钱关系,new Function ("return y") 只是函数的一种实例化方式,
"return y" 定义了方法体的内容,但只有在执行时才被解释,定义时并不检查,
return 后被外层得到,并被 alert(factory()()) 执行,此时找到的 y 就是“global”!

Function 标准实例化方式如下:
var functionName = new Function("argument 1",..."argument n", 
"statements for function body");
h155290688 2010-01-11
  • 打赏
  • 举报
回复
javascript确实很困挠人,要学会闭包和scope需要慢慢理解
js的作用域是在定义时就确定了的,和执行没关系,更多的问题可以google很多的
antony1029 2010-01-11
  • 打赏
  • 举报
回复
UP
happy002 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kingwolf_javascript 的回复:]
闭包害人啊
[/Quote]

呵呵,是挺害人的,我做web那会,有一次就因为这个问题,卡了1整天
ITDC_YiWang 2010-01-11
  • 打赏
  • 举报
回复
mark
kslion 2010-01-11
  • 打赏
  • 举报
回复
貌似有这些写法:

var methodA = function() {
//
}

function methodB(){
//
}
引1楼:
var functionName = new Function("argument 1",..."argument n",
"statements for function body");

引5楼:
通过调用 Function 构造函数创建的函数对象,其内部的 [[scope]] 属性引用的作用域链中始终只包含全局对象。

通过函数声明或函数表达式创建的函数对象,其内部的 [[scope]] 属性引用的则是创建它们的执行环境的作用域链。

在这里其实lz把第二个var y = "local"; 改为var x = "local"; 更能说明问题一点:
1、return function(){return x;}; 使用了闭包因为它能取得factory里面的x;
2、return new Function ("return x") 会报错,因为没有全局x变量。

87,955

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧