我想知道是否可以检查函数是否以其返回值存储在变量中的方式被调用,或者它是否被称为“独立”。
在第一种情况下,函数确实应该返回一些东西,否则它应该将值保存到我的对象的当前实例。
具体来说,我有Vector3D
如下:
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);
它不应返回任何内容(这是无用的),而是将返回坐标(x
,y
和z
)存储在vect1的变量中。因此vect1应该成为另一行代码中所谓的addedVector。
为了实现这一点,我想我将需要知道该函数是单独调用还是存储其返回值。
有没有办法实现这个目标?
答案 0 :(得分:3)
您可以很容易地将其拆分为两个函数add(vector)
和add_m(vector)
。
第二个函数(add_m
)将改变向量1并将向量2的值添加到它并且不返回任何内容,而第一个函数将创建一个新的向量作为结果并返回它。
答案 1 :(得分:1)
你无法找到它。让函数接受两个参数怎么样?
如果只传递了一个,则将其添加到调用该函数的向量中。
如果传递了两个,则创建一个新的并将它们相加。
类似的东西:
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
或
var addedVector = v1.add(v1, v2); // creates a new vector v1 + v2
但我同意创建两个独立的功能可能更好。一个函数应该只做一件事。
答案 2 :(得分:1)
无法知道调用者如何调用您的方法,即调用者是否已将返回值分配给变量。
答案 3 :(得分:1)
不。无法做到这一点,函数体完全独立于它所调用的代码上下文。听起来你想要两个独立的函数,一个用于添加,一个用于添加和返回一个新值。
答案 4 :(得分:1)
我有理由相信你所描述的是不可能的。尽管如此,你可能不想这样做。将您的代码与一小部分进行比较:
var addedVector = vect1.add(vect2);
vect1.add(vect2);
var addedVector = eval("vect1.add(vect2)");
eval("vect1.add(vect2)");
我很确定你会喜欢与那些没有的人一起工作的线路,对吗?然而,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返回结果。