0

如果我要function使用Function构造函数创建一个新的,我怎么能给它一个非临时范围来访问window(意味着只需要评估一次范围,而不是每次调用函数时)?目的是构造多个变量,这些变量需要一些非常昂贵的计算,我不想在每次调用函数时都重构它们,但我也不想将它们存储在window. 有任何想法吗?

4

4 回答 4

7

您可以使用bind关键字将函数绑定到特定上下文:

var context = {};
var f = new Function("args", "return this").bind(context);
f(); // context

由于绑定是在 ECMA 5th 中定义的,它可能不会出现在所有浏览器中,这里有一个解决方法

于 2012-12-17T11:47:27.750 回答
2

出于上述目的,您使用静态函数。您不能阻止在每次调用时评估范围,因为这是 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 或任何其他面向对象语言的全部功能。

于 2012-12-17T11:40:54.710 回答
0

不断增长的创建、存储、隐藏、显示和分组变量和函数的方法是通过“闭包”的魔力,这是 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 的先天原则,从更高的范围。

还有其他几种使用闭包的方法,替换对象构造函数,一次性无冲突私有函数等等。这里有很多关于它们的帖子。

于 2012-12-18T11:10:44.360 回答
0
var yourNamespace = {

func1: function() {
},

func2: function() {
}
};

...

yourNamespace.func1();

您可以通过从名称空间调用函数来调用所需的函数,例如 yourNamespace.func1();

于 2012-12-18T11:17:48.813 回答