繁体   English   中英

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

[英]JS - Accessing Function Parameters Array Outside of 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,这将是巨大的开销。


编辑我在发布此内容后意识到,我忘了提到我正在正确地调用var example = new actionFunction(); ,但由于某些原因,我/她遇到了问题。

就是说,与this方法相反,用哪种更干净,更逻辑,更可靠的方法将这些值存储在函数中,以便仍然可以通过外部调用如前所述的值来抓住它们?

this是您的函数被调用的对象。 this.defaultValues是该对象的属性。 如果未对函数进行任何调用,则全局(窗口)对象将为this ,因此this.defaultValues将为window.defaultValues ,也可以将其作为defaultValues访问

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} 

看来您误会了使用应该使用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比将其包括在内通常要简单得多-大多数人都不会在代码中包括此检查。

您的“函数”显然是JS类定义。

要访问它,您需要通过new创建该类的“实例”。

样品:

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

defaultValuesvaluesRanges被设定为上任何属性this是指在调用函数时。 大概您将函数视为构造函数,并使用new运算符调用它,这意味着this引用了一个新实例:

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

如果这不是您要执行的操作,则可能不希望使用this ,因为它将引用全局对象。

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

如果尚未执行此操作,因为您有多个应具有其自身默认值的“动作函数”,则可以将其设置为函数对象上的静态属性:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM