在JavaScript中封装

nic*_*ckb 49 javascript

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

(function() {
  // ...
})(this);
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 上面的代码是否正确?
  2. 如上所述封装整个JavaScript块有什么好处?

Dan*_*llo 86

对,那是正确的.它被称为自调用匿名函数表达式.

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>
Run Code Online (Sandbox Code Playgroud)

无论你在自我调用函数中声明什么都保存在一个单独的范围内.无法从其他任何地方访问变量x和函数myFunction().other-javascript.js例如,代码将不会看到它们,并且可以自由地声明另一个myFunction()没有冲突的函数.

  • 如何从封装外部向封装内的对象设置变量? (3认同)

CMS*_*CMS 36

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

(function(window){

})(this);
Run Code Online (Sandbox Code Playgroud)

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

另外,可以做的另一件事是指定一个名为的参数undefined,因为ECMAScript 3rdundefined上没有描述该属性.Edition Standard(不保证是否存在),在某些实现中,属性是可变的,例如:

(function(window, undefined){

})(this);
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我们有两个本地标识符(解析起来要快一点),window并且undefined只传递第一个(this总是引用全局代码中的全局对象(任何函数之外的代码)) ,第二个,将包含原始undefined值,因为我们没有传递任何值.

某些库(如jQuery)使用该模式.