[英]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;
defaultValues
和valuesRanges
被设定为上任何属性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.