当前位置: 首页 > 面试题库 >

这意味着全局名称空间将受到污染是什么意思?

施利
2023-03-14
问题内容

这意味着全局名称空间将受到污染是什么意思?

我不太了解被污染的全局名称空间的含义。


问题答案:

垃圾收集快速说明

由于变量失去作用域,因此将有资格进行垃圾回收。如果它们是全局作用域的,那么它们将不符合收集条件,直到全局名称空间失去作用域。

这是一个例子:

var arra = [];
for (var i = 0; i < 2003000; i++) {
 arra.push(i * i + i);
}

将其添加到全局名称空间(至少对我来说)应该会占用10,000 kb的内存使用量(win7
firefox),而不会被收集。其他浏览器可能对此处理方式有所不同。

而在范围内具有相同的代码却超出了范围:

(function(){
 var arra = [];
 for (var i = 0; i < 2003000; i++) {
  arra.push(i * i + i);
 }
})();

arra在关闭执行后将允许丢失范围,并有资格进行垃圾回收。

全球命名空间是您的朋友

尽管有很多人反对使用全局名称空间,但它还是您的朋友。并且像个好朋友一样,你不应该滥用自己的关系。

要温柔

不要滥用(通常称为“污染”)全局名称空间。我的意思是不要滥用全局名称空间-不要创建多个全局变量。这是一个使用全局名称空间的 错误 示例。

var x1 = 5;
var x2 = 20;
var y1 = 3
var y2 = 16;

var rise = y2 - y1;
var run = x2 - x1;

var slope = rise / run;

var risesquared = rise * rise;
var runsquared = run * run;

var distancesquared = risesquared + runsquared;

var distance = Math.sqrt(dinstancesquared);

这将创建11个全局变量,这些变量可能会在某个地方被覆盖或误解。

足智多谋

一种更灵活的方法,它不会污染全局名称空间,而是将其全部包装在模块模式中,并且在暴露多个变量时仅使用一个全局变量。

这是一个示例:(请注意,这很简单,没有错误处理)

//Calculate is the only exposed global variable
var Calculate = function () {
 //all defintions in this closure are local, and will not be exposed to the global namespace
 var Coordinates = [];//array for coordinates
 var Coordinate = function (xcoord, ycoord) {//definition for type Coordinate
   this.x = xcoord;//assign values similar to a constructor
   this.y = ycoord;
  };

  return {//these methods will be exposed through the Calculate object
   AddCoordinate: function (x, y) {
   Coordinates.push(new Coordinate(x, y));//Add a new coordinate
  },

  Slope: function () {//Calculates slope and returns the value
   var c1 = Coordinates[0];
   var c2 = Coordinates[1];
   return c2.y - c1.y / c2.x - c1.x;//calculates rise over run and returns result
  },

  Distance: function () {
   //even with an excessive amount of variables declared, these are all still local
   var c1 = Coordinates[0];
   var c2 = Coordinates[1];

   var rise = c2.y - c1.y;
   var run = c2.x - c1.x;

   var risesquared = rise * rise;
   var runsquared = run * run;

   var distancesquared = risesquared + runsquared;

   var distance = Math.sqrt(distancesquared);

   return distance;
  }
 };
};

//this is a "self executing closure" and is used because these variables will be
//scoped to the function, and will not be available globally nor will they collide
//with any variable names in the global namespace
(function () {
 var calc = Calculate();
 calc.AddCoordinate(5, 20);
 calc.AddCoordinate(3, 16);
 console.log(calc.Slope());
 console.log(calc.Distance());
})();


 类似资料:
  • 我想创建一个

  • 我在React教程上看过这个。这是什么意思? 反应是安全的。我们没有生成HTML字符串,因此XSS保护是默认设置。 如果 React 是安全的,XSS 攻击如何工作?如何实现这种安全性?

  • 看着新的Azure cosmos数据库,我对它的多模型特性有点困惑。具体而言,这是否意味着: a)相同的底层数据库/存储可以以多种方式并发查询,以便我可以对相同的集合使用gremlin图查询和mongodb api。 或 b)这是否意味着您可以在预配Cosmos DB时选择不同的模型(图、键值、列、文档),这就是从那时起存储数据的方式。 小册子让它听起来像a),但使用Azure仪表板创建cosmo

  • 问题内容: 我对gulp比较陌生,我想知道gulp任务到底是做什么的?我已经搜集到它通常在a 和after之后运行,但是它还必须更多。我一直无法在网上或gulp的文档中找到任何东西,我真的很想了解我在使用什么。 编辑我发现了这个,但是在解释它方面做得很差 问题答案: 从Node文档中: https://nodejs.org/api/stream.html#stream_visible_pipe_d

  • 问题内容: 我了解这是用来创建别名的。因此,将一个长名称别名为一个短名称是有意义的。但是,我看到一个查询 ,这意味着什么? 问题答案: 可以以多种方式使用别名,而不仅仅是缩短长列名。 在这种情况下,您的示例意味着您将返回一列始终包含的列,并且其别名/列名称为。 当您使用计算值(例如)时,也可以使用别名。