对js的一点疑问

ddgx 2017-02-09 04:20:04
//code snippet 1
!function a() {
a = 1;
console.log(a);//function

}();
console.log(window.a);//undefined 为什么不是1,自执行函数中的a=1,定义的不是全局变量么?



//code snippet 2
function a() {
a = 1;
console.log(a);//1
}
a();
console.log(window.a);//1


求解释下,这两段代码的结果为什么如此不同,自执行函数难度有特殊的注意点?
...全文
190 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ddgx 2017-02-10
  • 打赏
  • 举报
回复
引用 4 楼 congya001 的回复:
楼主你好,如果想彻底解决疑问,建议详细看一下关于匿名函数的文档
http://www.cnblogs.com/chenxianbin89/archive/2010/01/28/1658392.html

网上的很多解释(包括这篇)都是这样

也许是我理解错了,没有实际名字和没有名字 不是一回事。
jslang的解释更容易明白点。
//也是个匿名函数
var abc = function b(x, y) {
b=1;
console.log(b);//function
return x + y;
}
console.log(abc(2, 3));// "5"
console.log(b(2,3));//b is not defined




ddgx 2017-02-09
  • 打赏
  • 举报
回复
感谢二位,我在翻翻资料,研究研究。
文修 2017-02-09
  • 打赏
  • 举报
回复
楼主你好,如果想彻底解决疑问,建议详细看一下关于匿名函数的文档 http://www.cnblogs.com/chenxianbin89/archive/2010/01/28/1658392.html
天际的海浪 2017-02-09
  • 打赏
  • 举报
回复
引用 2 楼 wangwei703 的回复:
[quote=引用 1 楼 jslang 的回复:] 全局变量名和函数名同名了。 第一个代码自执行函数用的是匿名函数,匿名函数的函数名相当于函数内的局部变量,这样在函数内使用a访问的是这个函数,并且是只读的,不能重新赋值。 第二个代码用的是普通函数,普通函数的函数名是全局变量,可以重新赋值。
感谢,但还是不能理解为什么自执行函数是匿名函数,我一直以为没有函数名的才是匿名函数。[/quote] 匿名函数不是没有函数名。只是匿名函数的函数名相当于函数内的局部变量,只能在函数内访问。这样方便对匿名函数进行递归调用。 当function关键字出现在行首(语句首),它是一条“语句”,所创建(声明)的是普通函数。 当function关键字不是出现在行首(语句首),它就是一条“函数表达式”,所创建的就是匿名函数。
ddgx 2017-02-09
  • 打赏
  • 举报
回复
引用 1 楼 jslang 的回复:
全局变量名和函数名同名了。 第一个代码自执行函数用的是匿名函数,匿名函数的函数名相当于函数内的局部变量,这样在函数内使用a访问的是这个函数,并且是只读的,不能重新赋值。 第二个代码用的是普通函数,普通函数的函数名是全局变量,可以重新赋值。
感谢,但还是不能理解为什么自执行函数是匿名函数,我一直以为没有函数名的才是匿名函数。
天际的海浪 2017-02-09
  • 打赏
  • 举报
回复
全局变量名和函数名同名了。 第一个代码自执行函数用的是匿名函数,匿名函数的函数名相当于函数内的局部变量,这样在函数内使用a访问的是这个函数,并且是只读的,不能重新赋值。 第二个代码用的是普通函数,普通函数的函数名是全局变量,可以重新赋值。

87,993

社区成员

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

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