为了账号安全,请及时绑定邮箱和手机立即绑定

在JavaScript中“(函数(){})”和“(函数(){}()”)在功能上是否相等?

在JavaScript中“(函数(){})”和“(函数(){}()”)在功能上是否相等?

千万里不及你 2019-07-04 15:43:58
在JavaScript中“(函数(){})”和“(函数(){}()”)在功能上是否相等?以下两个代码块都处于警报状态。foo然后bar..唯一的区别是})()和}()).代码1:(function(){     bar = 'bar';     alert('foo');})();alert(bar);代码2:(function(){     bar = 'bar';     alert('foo');}());alert(bar);那么,除了语法之外,还有什么区别吗?
查看完整描述

3 回答

?
慕仙森

TA贡献1827条经验 获得超8个赞

不,他们是一样的


但是,如果添加new事先和.something之后,他们就会不一样了。

代码1

new (function() {
    this.prop = 4;}) ().prop;

此代码为该函数的类创建一个新实例,然后获取prop新实例的属性。
它回来了4.

它相当于

function MyClass() {
    this.prop = 4;}new MyClass().prop;

代码2

new ( function() {
    return { Class: function() { } }; }() ).Class;

此代码调用newClass财产。
由于函数调用的括号位于括号的外部集合内,因此它们不会被new表达式,然后正常调用函数,返回其返回值。
这个new表达式解析到.Class实例化了这一点。(后面的括号new是可选的)

它相当于

var namespace = { Class: function() { } };function getNamespace() { return namespace; }new ( getNamespace() ).Class;//Or,new namespace.Class;

的调用周围没有括号。getNamespace(),这将被解析为(new getNamespace()).Class-它将调用实例化getNamespace类并返回Class新实例的属性。


查看完整回答
反对 回复 2019-07-04
?
万千封印

TA贡献1891条经验 获得超3个赞

没有什么区别-开头的大括号只是一个语法提示,告诉解析器下面的内容是函数表达式而不是功能声明.


查看完整回答
反对 回复 2019-07-04
?
烙印99

TA贡献1829条经验 获得超13个赞

没什么区别。两者都是函数表达式。

还有第三条路:

+function() {
    bar = 'bar';
    alert('foo');}();

(而不是+(另一个操作员也能工作)

最常见的方法是

(function() {
    // ...})();

尽管如此。


查看完整回答
反对 回复 2019-07-04
  • 3 回答
  • 0 关注
  • 313 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号