javascript 里function的两种写法有何不同

我写了两个函数,我认为应该没啥区别,但是执行结果却大有区别。哪位高手帮我解释一下,这两种函数调用为什么会不同?functionclose(){varmyline=100;... 我写了两个函数,我认为应该没啥区别,但是执行结果却大有区别。哪位高手帮我解释一下,这两种函数调用为什么会不同?

function close(){

var myline=100;

return(function(){

return(myline++);

});

}

console.log(close()); //console output:// funciton()

console.log(close()()); //console output:// 100

console.log(close()()); //console output:// 100

//closure example

var copyclose=(function(){

var myline=300;

return(function(){

return myline++;

});

}());

console.log(copyclose()); //console output:// 300

console.log(copyclose()); //console output:// 301

console.log(copyclose); //console output:// function()
展开
 我来答
梦忠魂
2014-09-05 · TA获得超过299个赞
知道小有建树答主
回答量:392
采纳率:93%
帮助的人:166万
展开全部

应用上没有本质区别,区别在于函数声明的阶段。

function close(){...}

会在语法分析阶段完成函数声明,此方法的 function 放置在执行函数代码的后面也能够使用。

var copyclose=(function(){...}

会在代码执行阶段完成函数声明,此方法的 function 必须放置在执行函数代码的前面才能够使用。


例如下面的代码是用来获取函数的函数名,我们可以发现两种方式声明的函数是不一样的

var f = function() { console.log(arguments.callee.name) }
f();
// 此时返回 "" (空字符串)
function f() { console.log(arguments.callee.name) }
f();
// 此时返回 "f"

换一种更直观的方式来表达区别

a(); // 在赋值前进行
var a=function(){return 1;}
//此时会报错,TypeError: undefined is not a function
//以上代码的语法没有问题,但是 a 函数在赋值前就执行了,此时并未声明 a 函数,因此就报错了。

b();
function b(){return 2;}
//此时返回 2
追问
我现在想明白了。第二种写法,相当于指针引用。 就是定义了一个对象,然后用变量引用那个对象。非常感谢
追答

楼主的问题我只看了标题,代码只看了Close就仓促的回答。

以上回答与楼主的问题关系并不大,wuxd7 的回答是正确的,下面是过程解答。

var copyclose=(function b(){//这里的b没有意义,后面有分组操作符
var myline=300;
console.log(myline);
return(function(){  
console.log(myline);
return ++myline;        //先加后显示
});
}
()//分组操作符,使b函数自执行
);

先上一段代码,为了更方便查看数字的变化,改为了先加后显示。
以上代码的结果重点在于自执行函数,由于自执行函数的关系,b()函数被先执行了,因此 myline 已被定义,然后 copyclose 引用 return 返回的结果。

即:

function(){  
console.log(myline);
return ++myline;        //先加后显示
}

由于引用关系,闭包无法被释放,myline 依旧储存在内存中,当执行 copyclose() 时,实际执行的是以上代码。

最终看到的结果是:myline+1

wuxd7
推荐于2016-04-05 · TA获得超过323个赞
知道小有建树答主
回答量:452
采纳率:100%
帮助的人:280万
展开全部
当然不一样了
copyclose定义的时候就执行了。myline
只定义了一次。
而close是没有执行的
执行close()的之后每次都会初始化 myline=300;
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式