Javascript JS-访问范围外的函数参数数组
简介:多年来我经常光顾,但这是我的第一篇帖子。我已经仔细搜索过了,所以我很抱歉我忽略了它,这是一个副本Javascript JS-访问范围外的函数参数数组,javascript,function,variables,parameters,scope,Javascript,Function,Variables,Parameters,Scope,简介:多年来我经常光顾,但这是我的第一篇帖子。我已经仔细搜索过了,所以我很抱歉我忽略了它,这是一个副本 function actionFunction(values) { this.defaultValues = { valueX : 2.5, valueY : 5.5 }; this.valuesRanges = { xRange : { min : 0, max : 10 }, yRange : { mi
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
等在函数内部访问这些。我想知道的是如何在函数外部访问这些?我知道这很可能是返回
或范围/提升问题,只是不知道如何攻击它
基本上,我需要获取actionFunction.defaultValues.valueX
。另外,我想获取actionFunction.valuesRanges.xRange
中的值。我已经尝试过将它们作为数组或更多,但就是无法找到正确、适当的方法。我有很多这样的函数结构,我需要从中提取这些值,因此,一种模块化的方法可以做到这一点,而不必为$引入jQuery。extend()
和其他以开销为代价的基本功能将是非常好的
EDIT我在发布这篇文章后意识到,我忘了提到我正确调用了
var-example=new-actionFunction()代码>,但由于某种原因,am/出现问题
也就是说,与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}
function Test() { this.a = 1; }
这里的“函数”显然是一个JS类定义
要访问它,您需要通过new创建这个类的“实例”
样本:
var af=new actionFunction();
var defaultX=af.defaultValues.valueX;
var vrangeymin=af.valuesRanges.yRange.min;
似乎您误解了应该如何准确地使用使用this
的函数。通常,我们使用这些函数来构造基于它们的对象——我们称这些函数为“构造函数”。要使用构造函数,必须使用new
关键字,传递任何必要的参数。例如,如果我们有这个构造函数:
var o = new actionFunction();
console.log(o.defaultValues); // Object {valueX: 2.5, valueY: 5.5}
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
要比包含这一点简单得多——大多数人都不想在代码中包含这一检查。defaultValues
和valuesRanges
被设置为调用函数时该引用的任何对象的属性。假设您将该函数视为构造函数,并使用new
操作符调用它,这意味着此
引用了一个新实例:
var instance = new actionFunction();
instance.defaultValues; // This will be a reference to the object in question
如果这不是您正在做的,您可能不想使用this
,因为它将引用全局对象
如果是这种情况,并且您需要在函数外部访问该对象,那么只需在函数外部声明它,任何子作用域都可以访问它
如果您没有这样做,因为您有几个“操作函数”,它们应该有自己的默认值集,那么您可以将它们设置为函数对象上的静态属性:
actionFunction.defaultValues = { /*...*/ };
你在正确的轨道上。参见编辑;您将如何避免全局/这种潜在的失败?@user3223880:实际上没有更简单的方法,但是有一种解决方法可以将其作为构造函数应用,即使是正常调用它(尽管通常没有任何必要)。@user3223880:我刚刚注意到您说您确实已经完成了新actionFunction()
——您是否只是错误地尝试将其从actionFunction
中删除,还是存在其他一些不相关的问题?回答清晰、简洁。参见编辑;存储/访问这些(尤其是范围)的更好方法是什么?这是正确的方法。您可以从创建的对象中获取它们,如上一个示例所示<代码>示例.valuesRanges.yRange.min
。您可以采用更为面向对象的方式来保持它们的私有性,并通过方法公开它们,但我发现在JS中这样做太过分了。