首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript封装

JavaScript封装
EN

Stack Overflow用户
提问于 2010-08-29 23:58:23
回答 3查看 42.8K关注 0票数 55

很久以前,我看到有人用代码封装了他们的整个JavaScript块,如下所示:

代码语言:javascript
运行
复制
(function() {
  // ...
})(this);

问题:

  1. 上面的代码正确吗?
  2. 像上面提到的那样封装整个JavaScript块有什么好处?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-30 00:02:37

是的,没错。它被称为自调用匿名函数表达式。

JavaScript变量具有函数作用域或全局范围。没有块范围。将代码封装在自调用函数中,如示例中的函数,将创建一个临时本地作用域,用于一次性运行的代码,而不会污染全局命名空间。

请考虑以下几点:

代码语言: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(),而不会发生冲突。

票数 91
EN

Stack Overflow用户

发布于 2010-08-30 01:22:24

此外,除了@Daniel的答案之外,将this传递给函数是一种常见的模式,可以引用全局对象,例如:

代码语言:javascript
运行
复制
(function(window){

})(this);

在浏览器脚本中,全局对象有一个名为window的属性,它引用全局对象本身,而在其他环境中没有window属性。

另外,可以做的另一件事是指定一个名为undefined的参数,因为undefined属性没有在ECMAScript 3中描述。版本标准(没有存在或不存在的保证),而且在某些实现中,属性是可变的,例如:

代码语言:javascript
运行
复制
(function(window, undefined){

})(this);

在上面的示例中,我们有两个本地标识符(解析速度更快),windowundefined,只有第一个被传递(this总是引用全局代码中的全局对象(任何函数之外的代码)),第二个将包含原始的undefined值,因为我们没有向它传递任何值。

一些库(如jQuery )使用了这种模式。

票数 39
EN

Stack Overflow用户

发布于 2019-07-10 14:49:49

为了记录在案,ECMA TC39提出了一种私有语法。根据建议,为了使javascript类字段成为私有字段,您需要在其前缀加上一个散列'#‘。这是为了提供某种类型的运行时封装。

示例:

代码语言:javascript
运行
复制
class B {
  #hidden = 0;
  m() {
    return this.#hidden;
  }
}

Chrome支持这一点,因为Chrome v74。如果这个私有语法变成了一个standart,我们将能够从javascript中的运行时封装中受益,并且在类型记录中受益,因为它的传输溢出将以这种方式被更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3597087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档