JS - 访问范围之外的函数参数数组

时间:2014-01-22 14:39:33

标签: javascript function variables parameters scope

简介:我经常光顾SO,但这是我的第一篇文章。我已经大量搜索了这个,所以如果我忽略了它,我很抱歉这是重复的。

function actionFunction(values) {
    this.defaultValues = {
        valueX : 2.5,
        valueY : 5.5
    };
    this.valuesRanges = {
        xRange : { min : 0, max : 10 },
        yRange : { min : 5, max : 10 }
    };
 };

显然我可以使用this.defaultValues.valueX等在函数内部访问这些内容。我想知道的是如何在函数外部访问这些内容?我知道这很可能是return或范围/提升问题,只是不知道如何攻击它。

基本上,我需要获得actionFunction.defaultValues.valueX。另外,我想获得actionFunction.valuesRanges.xRange内的值。我已经尝试过将这些作为数组和更多,但只是无法弄清楚正确,正确的方法。我有很多这样的结构,我需要从中提取这些值,所以这样做的模块化方法不需要为$.extend()引入jQuery,而且其他基本功能都需要花费很多。< / p>


编辑我在发布此消息后意识到我忘了提及我正在调用var example = new actionFunction();,但出于某种原因我/是否有问题。

也就是说,与this方法相比,在函数中存储这些值的更清晰,更合理,更可靠的方法是什么,以便它们仍然可以通过外部调用获取值,如前所述提到?

4 个答案:

答案 0 :(得分:1)

this是调用函数的对象。 this.defaultValues是该对象的属性。如果你的函数没有被调用,那么全局(窗口)对象将是this,因此this.defaultValues将是window.defaultValues,也可以defaultValues < / p>

function actionFunction(values) {
    this.defaultValues = {
        valueX : 2.5,
        valueY : 5.5
    };
    this.valuesRanges = {
        xRange : { min : 0, max : 10 },
        yRange : { min : 5, max : 10 }
    };
 };

actionFunction();

console.log(window.defaultValues); // Object {valueX: 2.5, valueY: 5.5} 
console.log(defaultValues); // Object {valueX: 2.5, valueY: 5.5} 

如果您在某个对象上调用该函数,则this将成为该对象,而this.defaultValues将为obj.defaultValues

var obj = {};
actionFunction.call(obj);

console.log(obj.defaultValues); // Object {valueX: 2.5, valueY: 5.5} 

当您将该函数用作构造函数时会发生类似的事情,除了该对象将被隐式创建并由构造函数返回:

var o = new actionFunction();

console.log(o.defaultValues); // Object {valueX: 2.5, valueY: 5.5} 

答案 1 :(得分:1)

您似乎误解了应该如何使用this的功能。通常,我们使用这些类型的函数来构造基于它们的对象 - 我们将这些函数称为“构造函数”。要使用构造函数,必须使用new关键字,传递任何必要的参数。例如,如果我们有这个构造函数:

function Test() { this.a = 1; }

我们可以通过以下方式创建一个实例(基于构造函数的对象):

var foo = new Test();
console.log(foo.a); // 1

然而,正如@Tibos指出的那样,将其称为正常功能将无法正常工作 - 这可能不是您想要的。在大多数情况下,它将在全局范围内定义(默认情况下变量是在哪里)。但是,您不应该像普通函数一样调用构造函数,因为this的值在某些情况下会发生变化,并且在函数中滥用this可能会误导其他函数。

var foo = Test(); // no "new"
console.log(a); // 1
console.log(foo.a); // TypeError: Cannot read property 'a' of undefined

让我们回到你原来的构造函数。通过在构造函数中使用new,而不是将其作为普通函数调用,我们可以这样做:

function actionFunction(values) {
    this.defaultValues = {
        valueX : 2.5,
        valueY : 5.5
    };
    this.valuesRanges = {
        xRange : { min : 0, max : 10 },
        yRange : { min : 5, max : 10 }
    };
}

var example = new ActionFunction();
console.log(example.defaultValues.valueX); // 2.5

如果您愿意,可以通过检查确保它始终返回实例:

if (!(this instanceof actionFunction)) return new ActionFunction(arg1, arg2, ...);

虽然总是记得使用new作为构造函数而不是包含它,但通常更简单 - 大多数人都不会在代码中包含这些检查。

答案 2 :(得分:0)

你的“功能”显然是JS类的定义。

要访问它,您需要通过new;

创建此类的“实例”

样品:

var af=new actionFunction();
var defaultX=af.defaultValues.valueX;
var vrangeymin=af.valuesRanges.yRange.min;

答案 3 :(得分:0)

defaultValuesvaluesRanges被设置为调用函数时this引用的属性。假设您将该函数视为构造函数并使用new运算符调用它,这意味着this引用了一个新实例:

var instance = new actionFunction();
instance.defaultValues; // This will be a reference to the object in question

如果那不是你正在做的事情,你可能不想使用this,因为它会引用全局对象。

如果是这种情况,并且您需要在函数外部访问该对象,则只需在函数外部声明它,任何后代作用域都可以访问它。

如果你没有这样做,因为你有几个应该有自己的默认值的“动作函数”,你可以将它们设置为函数对象的静态属性:

actionFunction.defaultValues = { /*...*/ };