如果我要function
使用Function
构造函数创建一个新的,我怎么能给它一个非临时范围来访问window
(意味着只需要评估一次范围,而不是每次调用函数时)?目的是构造多个变量,这些变量需要一些非常昂贵的计算,我不想在每次调用函数时都重构它们,但我也不想将它们存储在window
. 有任何想法吗?
4 回答
您可以使用bind
关键字将函数绑定到特定上下文:
var context = {};
var f = new Function("args", "return this").bind(context);
f(); // context
由于绑定是在 ECMA 5th 中定义的,它可能不会出现在所有浏览器中,这里有一个解决方法
出于上述目的,您使用静态函数。您不能阻止在每次调用时评估范围,因为这是 JavaScript 的工作方式,但您可以通过不在window
范围链中来加速它。
var namespace = {};
namespace.someMethod = function() {
// do something here.
};
现在,在您的代码中的任何地方,您都可以使用namespace.someMethod();
. 小心点。以上是静态方法。您可以在不实例化的情况下调用它。但是你不能this.property
在静态函数中使用。这是一个潜在的非常危险的操作,因为它可能会授予对全局对象的扩展访问权限,并且基本上是不受限制的权限。
上面是一个静态的JavaScript 方法。它在作用域链中没有窗口。
以下是使用相同模式创建构造函数的方法。当你想使用构造函数时,你总是在使用之前实例化。为此,您有new
关键字。
var namespace = {};
namespace.coordinate = function(x, y) {
this.x = x;
this.y = y;
};
namespace.coordinate.prototype.addCoordinates = function() {
return this.x + this.y;
};
现在您可以在代码中的任何位置执行以下操作:
var coordinateObject = new namespace.coordinate(5,10);
// you have created a new instance.
alert(coordinateObject.addCoordinates());// will alert 15;
// now you can make as many as you want. They will behave as instances.
// This means they do not interfere with each other in any way.
// They just have the same properties and methods, but the instance values
// Can be entirely different.
var secondCoordinateObject = new namespace.coordinate(10, 25);
alert(secondCoordinateObject.addCoordinates());// will output 35.
你已经成功地创建了你的namespace.coordinate
类的一个实例。使用我给您的模式,您几乎可以复制 Java 或 C 或任何其他面向对象语言的全部功能。
不断增长的创建、存储、隐藏、显示和分组变量和函数的方法是通过“闭包”的魔力,这是 Javascript 最强大但最不为人知的特性:
var groupObj = (function (setUp) {
// maintained by reference, hidden
var _priVar = setUp * 2;
// maintained by reference, revealed (through returned object)
var _pubVar = 8;
var _pubFunc = function (x) {
_priVar += x;
_pubVar += x;
}
var lostVar = setUp * 99; // not referenced, hidden, so evaporates!
return {
'pubVar' : _pubVar,
'pubFunc' : _pubFunc
}
}(4)); // runs immediately with 4 as setUp, revealing pubVar & pubFunc
然后...
groupObj.pubFunc(7); // runs public function, adds 7 to both variables
alert('public variable: ' + groupObj.pubVar); // alerts public variable
每当另一个函数内部有一个函数时,就会发生闭包。外部函数内部的变量将被维护,只要它被内部函数引用,这是一种“无人区”,其中变量通过从较低范围的引用强制存在,但被隐藏由于 Javascript 的先天原则,从更高的范围。
还有其他几种使用闭包的方法,替换对象构造函数,一次性无冲突私有函数等等。这里有很多关于它们的帖子。
var yourNamespace = {
func1: function() {
},
func2: function() {
}
};
...
yourNamespace.func1();
您可以通过从名称空间调用函数来调用所需的函数,例如 yourNamespace.func1();