在项目中看到这样的代码,不知道是什么意思

var Names = (function () { 
    function Names() {}       
    Names.HOME = "home";
    return Names;
})();
阅读 3.8k
7 个回答

没什么意思的代码,我想最有可能的就是形成了一个闭包。浪费空间?

clipboard.png

通常用这种方法在js实现类,避免污染全局空间。

例如下面这段Type Script代码:

class Names {
    static HOME = "home";
}

编译之后生成的JS:

var Names = (function () {
    function Names() {
    }
    return Names;
}());
Names.HOME = "home";

差别就是Names.HOME = "home";的位置。

不是很理解,
感觉是想构造一个合成类型的实例,这个实例包含一个属性和一个初始化行为

这个写法叫IIFE。立即执行表达式!

这段代码感觉是没什么意义,但这种写法感觉有意义。我自己最近经常这样写代码,可以看看https://github.com/loatheb/tiny-deferred/blob/master/index.js

对于一个构造函数来说,在原型链上想访问一些变量只能通过两种方式

  • 全局变量

  • 写进this

var a = 1;
function Foo() {
}
Foo.prototype.add = function() {
    a++;
}
function Foo() {
    this.a = 1;
}
Foo.prototype.add = function() {
    this.a++;
}

写进this相对来说好看一些,然而每次都将变量写进this会造成this过大,而且暴露很多不想暴露的变量。

所以用楼主这种写法就可以保护变量,充当static作用。

var Foo = function () {
    var a = 1;
    function Foo() {
        // 可以访问到a
    }
    Foo.prototype.add = function() {
        // 可以访问a
    }
    return Foo;
}
a    // undefined

其次这样可以强制实际函数调用的方法

var Foo = function() {
    if (!(this instanceof Foo)) {
        throw new Error('must use `new` syntax!');
        // 没有使用 new 关键词进行构造调用
    }
    console.log(true);
}

Foo();    // error
new Foo();    // true

我们可以这样写:

var Foo = function() {
    function Foo() {
        console.log(true);
    }
    return new Foo();
}
new Foo();    // true
Foo();    // true

对于内部函数来说,也是一个对象,也可以给它相应的属性。

var Foo = function() {
    function Foo() {
        console.log(true);
    }
    Foo.status = function() {
        console.log(true);
    }
    return new Foo();
}

Foo().status;    // true

希望能跟大家交流,谢谢。

在匿名函数中定义了Names函数,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”
理论上创建一个匿名函数并立刻执行可以这么写:

function(){ 
    function Names(){}       
    Names.HOME = "home";
    return Names;
}();

但是由于JavaScript语法解析的问题,会报SyntaxError错误,因此需要用括号把整个函数定义括起来:

(function () { 
    function Names() {}       
    Names.HOME = "home";
    return Names;
})();
var Names = (function () { 
    function Names() {}       
    Names.HOME = "home";
    return Names;
})();

立即执行函数大家都知道

里面比较特殊的我感觉是

Names.HOME = "home";

他为函数设置了一个私有的属性,可能这段代码看不出有什么用,但是如果将他写成一个计数器就比较有意义了,如下:

var Names = (function () { 
    function Names() {Names.COUNT++}       
    Names.COUNT = 0;
    return Names;
})();

Names();
console.log(Names.COUNT);    // 1
Names();
console.log(Names.COUNT);    // 2
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题