函数后面跟()后,返回的是什么?

泛用人形代码复制机 2014-09-30 09:18:40
 
var initPage = function () {
//methodBody
}();
$("#btnRefreash").click(function () {
initPage();
});


如上,我initPage在doucument.ready时候先调用一次,这个是正常的,
但是后面点击btnRefreash时候,initPage这个变量是undefined. 为何?
...全文
261 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
嗯 其实还是可以类比委托, 只是js是弱类型,所以initpage既能用函数赋值,又能用函数的返回值赋值, 但两者是不同的行为.
  • 打赏
  • 举报
回复
ls的答案很好,这下子理解了,感谢... 看来还是对函数式编程这个思维模式不够熟悉. js的函数所代表的概念 比java c#之类的丰富得多
天际的海浪 2014-10-08
  • 打赏
  • 举报
回复
引用 10 楼 sj178220709 的回复:
//methodBody 不返回如何东西. 代码运行情况我已经知道了, 不加() 就是定义一个匿名函数,然后赋值给initpage这个变量, 加了后就是执行匿名函数,并将函数返回的结果(void)赋值给initpage这个变量,所以是undefined 就是不太理解为什么这样. 感觉这个语法糖已经破坏了语法的统一性了.
你可以这样理解: js中的函数其实是一种数据,与数值,数组和字符串是一样的。 一个函数后面的()实际上是执行函数的运算符,和+-*/没有多少区别。 这两个好理解吧 1)

var a = 123;
var r = a * 2;
2)

var a = function () { alert(123); };
var r = a();
那么1)可以改成

var r = 123 * 2;
同样的2)也可以改成

var r = function () { alert(123); }();
  • 打赏
  • 举报
回复
引用 6 楼 save4me 的回复:

var initPage = function () {
               //methodBody
            }();
加上了(),function部分已经执行了,除非function返回的是另一个函数,即initPage是一个函数,才能initPage()执行。 你methodBody的代码是怎么样的? [quote=引用 4 楼 sj178220709 的回复:] 返回值是函数体的东西啊, var initPage = function () { //methodBody }; 这个是把整个函数的引用赋值给initPage , 加个() , 就变成了将函数返回值赋值给initPage ? 感觉好诡异... 作用域应该没问题吧,都在一个作用域内.
[/quote] //methodBody 不返回如何东西. 代码运行情况我已经知道了, 不加() 就是定义一个匿名函数,然后赋值给initpage这个变量, 加了后就是执行匿名函数,并将函数返回的结果(void)赋值给initpage这个变量,所以是undefined 就是不太理解为什么这样. 感觉这个语法糖已经破坏了语法的统一性了.
  • 打赏
  • 举报
回复
引用 2 楼 ly12530 的回复:

 var initPage = function () {
               alert("11");
            };
			$(function(){
			$("#btnRefreash").click(function () {
                initPage();
            });
			});
感觉该这么写呢。。
逻辑都变了啊! 我原来是初始一次 , btnRefreash按了也执行一次 除非再加个 initPage(); 调用,这当然就没问题了...
会飞的Pikachu 2014-10-01
  • 打赏
  • 举报
回复
这是自执行代码 立即执行的
save4me 2014-09-30
  • 打赏
  • 举报
回复

var initPage = function () {
               //methodBody
            }();
加上了(),function部分已经执行了,除非function返回的是另一个函数,即initPage是一个函数,才能initPage()执行。 你methodBody的代码是怎么样的?
引用 4 楼 sj178220709 的回复:
返回值是函数体的东西啊, var initPage = function () { //methodBody }; 这个是把整个函数的引用赋值给initPage , 加个() , 就变成了将函数返回值赋值给initPage ? 感觉好诡异... 作用域应该没问题吧,都在一个作用域内.
似梦飞花 2014-09-30
  • 打赏
  • 举报
回复
引用 和调用的 关系啊
  • 打赏
  • 举报
回复
引用 1 楼 showbo 的回复:
你函数没有返回值吧。加了()就是执行这个匿名函数了,而不是将匿名函数复制给initPage变量 而且要注意变量的作用域
返回值是函数体的东西啊, var initPage = function () { //methodBody }; 这个是把整个函数的引用赋值给initPage , 加个() , 就变成了将函数返回值赋值给initPage ? 感觉好诡异... 作用域应该没问题吧,都在一个作用域内.
xuzuning 2014-09-30
  • 打赏
  • 举报
回复
加 () 就是立即执行 返回什么,由函数决定
Null_Reference 2014-09-30
  • 打赏
  • 举报
回复

 var initPage = function () {
               alert("11");
            };
			$(function(){
			$("#btnRefreash").click(function () {
                initPage();
            });
			});
感觉该这么写呢。。
  • 打赏
  • 举报
回复
你函数没有返回值吧。加了()就是执行这个匿名函数了,而不是将匿名函数复制给initPage变量 而且要注意变量的作用域

87,997

社区成员

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

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