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

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

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

垃圾收集快速说明

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

这是一个例子:

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 = 3var 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 variablevar 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());})();


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5009203.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存