如何在JavaScript中使用功能构造函数的范围?

时间:2012-12-17 11:36:37

标签: javascript function scope

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

4 个答案:

答案 0 :(得分:7)

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

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

由于bind是在ECMA 5th中定义的,因此它可能不会出现在所有浏览器中,here's a workaround

答案 1 :(得分: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或任何其他面向对象语言的整个功能。

答案 2 :(得分: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

只要另一个函数内部存在函数,就会发生闭包。只要内部函数引用了outter函数内部的变量,它就是一种“无人区域”,其中变量通过从较低范围引用而被强制存在,但是被隐藏由于Javascript的先天原则,从更高的范围。

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

答案 3 :(得分:0)

var yourNamespace = {

func1: function() {
},

func2: function() {
}
};

...

yourNamespace.func1();

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