Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS-访问范围外的函数参数数组_Javascript_Function_Variables_Parameters_Scope - Fatal编程技术网

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中这样做太过分了。