很久以前,我看到有人用代码封装了他们的整个JavaScript块,如下所示:
(function() {
// ...
})(this);问题:
发布于 2010-08-30 00:02:37
是的,没错。它被称为自调用匿名函数表达式。
JavaScript变量具有函数作用域或全局范围。没有块范围。将代码封装在自调用函数中,如示例中的函数,将创建一个临时本地作用域,用于一次性运行的代码,而不会污染全局命名空间。
请考虑以下几点:
<html>
<body>
...
<script>
(function() {
var x = '';
function myFunction () {
alert('Hello: ' + x);
}
x = 'Bob';
myFunction();
alert(typeof x); // string
alert(typeof myFunction); // function
})();
alert(typeof x); // undefined
alert(typeof myFunction); // undefined
</script>
<script src="other-javascript.js"></script>
</body>
</html>在该自调用函数中声明的任何内容都保存在一个单独的作用域中。变量x和函数myFunction()不能从其他地方访问。例如,other-javascript.js中的代码看不到它们,并且可以自由地声明另一个函数myFunction(),而不会发生冲突。
发布于 2010-08-30 01:22:24
此外,除了@Daniel的答案之外,将this传递给函数是一种常见的模式,可以引用全局对象,例如:
(function(window){
})(this);在浏览器脚本中,全局对象有一个名为window的属性,它引用全局对象本身,而在其他环境中没有window属性。
另外,可以做的另一件事是指定一个名为undefined的参数,因为undefined属性没有在ECMAScript 3中描述。版本标准(没有存在或不存在的保证),而且在某些实现中,属性是可变的,例如:
(function(window, undefined){
})(this);在上面的示例中,我们有两个本地标识符(解析速度更快),window和undefined,只有第一个被传递(this总是引用全局代码中的全局对象(任何函数之外的代码)),第二个将包含原始的undefined值,因为我们没有向它传递任何值。
一些库(如jQuery )使用了这种模式。
发布于 2019-07-10 14:49:49
为了记录在案,ECMA TC39提出了一种私有语法。根据建议,为了使javascript类字段成为私有字段,您需要在其前缀加上一个散列'#‘。这是为了提供某种类型的运行时封装。
示例:
class B {
#hidden = 0;
m() {
return this.#hidden;
}
}Chrome支持这一点,因为Chrome v74。如果这个私有语法变成了一个standart,我们将能够从javascript中的运行时封装中受益,并且在类型记录中受益,因为它的传输溢出将以这种方式被更新。
https://stackoverflow.com/questions/3597087
复制相似问题