Javascript 检查是否使用了函数结果值
我想知道是否有可能检查函数的调用方式是将其返回值存储在变量中,还是将其称为“独立”函数 在第一种情况下,函数确实应该返回一些内容,但如果不是这样,它应该将值保存到对象的当前实例 具体来说,我有一个向量3D,如下所示:Javascript 检查是否使用了函数结果值,javascript,Javascript,我想知道是否有可能检查函数的调用方式是将其返回值存储在变量中,还是将其称为“独立”函数 在第一种情况下,函数确实应该返回一些内容,但如果不是这样,它应该将值保存到对象的当前实例 具体来说,我有一个向量3D,如下所示: function Vector3D(x, y, z) { this.x = parseNumber(x); this.y = parseNumber(y); this.z = parseNumber(z); } Vector3D.prototype.add = fun
function Vector3D(x, y, z) {
this.x = parseNumber(x);
this.y = parseNumber(y);
this.z = parseNumber(z);
}
Vector3D.prototype.add = function(that) {
return new Vector3D(
this.x + that.x,
this.y + that.y,
this.z + that.z
);
};
可以看出,add函数根据对象实例本身和另一个实例返回一些内容。现在,必须以如下方式调用函数:
var addedVector = vect1.add(vect2);
vect1.add(vect2);
然而,如果我这样称呼它:
var addedVector = vect1.add(vect2);
vect1.add(vect2);
它不应该返回任何无用的东西,而是将返回坐标x、y和z存储在vect1的变量中。所以vect1应该成为另一行代码中的addedVector
要实现这一点,我想我需要知道函数是单独调用还是存储其返回值
有什么办法可以做到这一点吗?你找不到。让函数接受两个参数怎么样 如果只传递一个,则将其添加到调用函数的向量中 如果传递了两个,则创建一个新的并求和 比如:
Vector3D.prototype.add = function(vec1, vec2) {
var target = vec2 ? new Vector3D(0,0,0) : this;
vec1 = vec2 ? vec1 : this;
vec2 = vec2 || vec1;
target.x = vec1.x + vec2.x;
target.y = vec1.y + vec2.y;
target.z = vec1.z + vec2.z;
return target;
}
然后,您可以使用以下命令调用它:
v1.add(v2); // adds v2 to v1
或
但我同意创建两个单独的函数可能更好。一个函数应该只做一件事。你找不到。让函数接受两个参数怎么样 如果只传递一个,则将其添加到调用函数的向量中 如果传递了两个,则创建一个新的并求和 比如:
Vector3D.prototype.add = function(vec1, vec2) {
var target = vec2 ? new Vector3D(0,0,0) : this;
vec1 = vec2 ? vec1 : this;
vec2 = vec2 || vec1;
target.x = vec1.x + vec2.x;
target.y = vec1.y + vec2.y;
target.z = vec1.z + vec2.z;
return target;
}
然后,您可以使用以下命令调用它:
v1.add(v2); // adds v2 to v1
或
但我同意创建两个单独的函数可能更好。函数只能做一件事。无法知道调用者是如何调用方法的,即调用者是否已将返回值分配给变量 无法知道调用者是如何调用方法的,即调用者是否已将返回值分配给变量 您可以很容易地将其分解为两个函数,addvector和add_mvector
第二个函数add_m将对向量1进行变异,并向其添加向量2的值,但不返回任何结果,而第一个函数将生成一个新的向量作为结果并返回它。您可以很容易地将其分为两个函数,addvector和add_mvector
第二个函数add_m将对向量1进行变异,并向其添加向量2的值,但不返回任何内容,而第一个函数将生成一个新的向量作为结果并返回它。否。无法做到这一点,函数体完全独立于调用它的代码上下文。听起来您需要两个独立的函数,一个用于就地添加,另一个用于添加并返回新值。否。无法做到这一点,函数体完全独立于调用它的代码上下文。听起来您需要两个独立的函数,一个用于就地添加,另一个用于添加并返回新值。我有理由相信您所描述的是不可能的。即使是这样,你也可能不想那样做。将您的代码与一个小变体进行比较:
var addedVector = vect1.add(vect2);
vect1.add(vect2);
var addedVector = eval("vect1.add(vect2)");
eval("vect1.add(vect2)");
我很确定你希望有eval的行和没有eval的行一样工作,对吗?然而eval必须使用返回值,这样它就可以在外部传播它
现在,我要做的是编写我碰巧需要的以下任何函数:
v1.add(v2); // returns (v1+v2), v1 and v2 are unchanged
v1.addFrom(v2) // v1 = v1 + v2, v2 is unchanged, returns undefined
v1.addTo(v2) // v2 = v1 + v2, v1 is unchanged, returns undefined
根据使用情况,我可能会也可能不会让addTo/addFrom返回结果。我有理由相信您所描述的是不可能的。即使是这样,你也可能不想那样做。将您的代码与一个小变体进行比较:
var addedVector = vect1.add(vect2);
vect1.add(vect2);
var addedVector = eval("vect1.add(vect2)");
eval("vect1.add(vect2)");
我很确定你希望有eval的行和没有eval的行一样工作,对吗?然而eval必须使用返回值,这样它就可以在外部传播它
现在,我要做的是编写我碰巧需要的以下任何函数:
v1.add(v2); // returns (v1+v2), v1 and v2 are unchanged
v1.addFrom(v2) // v1 = v1 + v2, v2 is unchanged, returns undefined
v1.addTo(v2) // v2 = v1 + v2, v1 is unchanged, returns undefined
根据用法的不同,我可能会也可能不会让addTo/addFrom返回结果。只要您将正确的标记为已回答,就可以随意提问。只要您将正确的标记为已回答,就可以随意提问。这是一种可能性,尽管根据是否使用返回值,我必须使用不同的表示法。但是如果不可能找到答案,我想这是唯一的可能我认为你误解了我的问题。如果像vect1.addvect2那样调用,它应该对向量进行变异,但是如果像var added=vect1.addvect2那样调用,它应该返回加法向量,而不进行任何变异。谢谢你@好的,我更新了。这可能不是最好的解释,但这是一种方法。非常感谢,但我想我会的
继续创建不同的函数这是可能的,尽管根据是否使用返回值,我必须使用不同的表示法。但是如果不可能找到答案,我想这是唯一的可能我认为你误解了我的问题。如果像vect1.addvect2那样调用,它应该对向量进行变异,但是如果像var added=vect1.addvect2那样调用,它应该返回加法向量,而不进行任何变异。谢谢你@好的,我更新了。这可能不是最好的解释,但这是一种方法。非常感谢,但我认为我确实会继续创建不同的函数+1,但imo add应该始终是突变,otehr应该被称为组合/concat或类似的+1,但imo add应该始终是突变,otehr应该被称为组合/concat或类似的东西