var Names = (function () {
function Names() {}
Names.HOME = "home";
return Names;
})();
var Names = (function () {
function Names() {}
Names.HOME = "home";
return Names;
})();
通常用这种方法在js实现类,避免污染全局空间。
例如下面这段Type Script代码:
class Names {
static HOME = "home";
}
编译之后生成的JS:
var Names = (function () {
function Names() {
}
return Names;
}());
Names.HOME = "home";
差别就是Names.HOME = "home";
的位置。
这段代码感觉是没什么意义,但这种写法感觉有意义。我自己最近经常这样写代码,可以看看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
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.4k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.4k 阅读✓ 已解决
6 回答1.1k 阅读
没什么意思的代码,我想最有可能的就是形成了一个闭包。浪费空间?