这是什么意思全球命名空间会被污染?

这是什么意思全球命名空间会被污染?

我真的不明白是什么全球命名空间被污染的手段。

关于垃圾收集的快速笔记

随着变量丢失范围,他们将有资格进行垃圾回收。 如果它们是全局范围的,那么在全局名称空间失去范围之前,它们将不具备收集的资格。

这里是一个例子:

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

添加到您的全局名称空间(至少对我来说)应该广告10,000 kb的内存使用(win7的火狐),这将不会被收集。 其他浏览器可以以不同的方式处理。

而在这样的范围内有相同的代码:

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

执行封闭后可能会丢失范围,并有资格进行垃圾回收。

全球命名空间是你的朋友

尽管许多人声称使用全局命名空间,但它是你的朋友。 而且就像一个好朋友,你不应该滥用你的关系。

要温柔

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

 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()); })(); 

在JavaScript中,函数之外的声明在全局范围内。 考虑这个小例子:

 var x = 10; function example() { console.log(x); } example(); //Will print 10 

在上面的例子中, x是在全局范围内声明的。 任何子范围(例如由example函数创建的子范围)都有效地继承了在任何父范围(在这种情况下,这只是全局范围)中声明的东西。

重新声明在全局范围中声明的变量的任何子范围都将隐藏全局变量,可能导致不必要的,很难跟踪错误:

 var x = 10; function example() { var x = 20; console.log(x); //Prints 20 } example(); console.log(x); //Prints 10 

通常不建议使用全局变量,因为可能导致这样的问题。 如果我们没有在example函数中使用var语句,我们将意外覆盖全局范围内的x的值:

 var x = 10; function example() { x = 20; //Oops, no var statement console.log(x); //Prints 20 } example(); console.log(x); //Prints 20... oh dear 

如果你想阅读更多,理解正确,我建议通过ECMAScript规范 。 这可能不是最令人兴奋的阅读,但它将无法结束。

当你声明全局变量,函数等,他们,嗯,去全球命名空间。 除了性能/内存问题(可能会出现这个问题),当你重新定义一个重要的变量或者不使用你认为使用的值的时候,你很可能会碰到不幸的名字冲突。

在全局命名空间中定义事物是可以避免的。