Noob问题,搜索但没有找到这个特定问题的答案。 我正在构建一个对象,并使用'this'关键字引用参数的参数:
function Obj(a, b, c) {
this.a = a;
this.b = b;
this.c = c;
this.addMe = function() {
alert(this.a + this.b + this.c);
};
}
我的问题很简单:如果a,b和c仅存在于对象中(换句话说,没有使用相同名称声明的全局变量),那么在使用它们时需要'this'关键字addMe()方法?该方法不能简单地写成:
this.addMe = function() {
alert(a + b + c);
};
当我通过创建一个新的Obj实例运行此代码时,它的工作方式完全相同。并且(不是我会这样做)如果我为实例化新Obj时使用的参数创建a,b和c的全局变量值,这些与方法调用的结果无关。那么,如果我不在方法中使用'this',我会错过一些会回来咬我的东西吗?
答案 0 :(得分:1)
如果您知道this.a
(例如)永远不会被重新分配,那么是的,它们实际上应该是相同的。
如果是,那就是大。如果你以后忘记了你打算永远不会重新分配它们怎么办?然后你有一个奇怪的错误,可能很难追查。
示例:
function Obj(a) {
this.a = a;
this.show = function() {
console.log(this.a);
console.log(a)
};
}
var obj = new Obj(1);
obj.show();
obj.a = 2;
obj.show(); // OOPS!
请注意,对show
的第二次调用会给出两个不同的值。 show
函数围绕原始值a
创建闭包;基本上保存它。 1}}重新分配时保持不变。
除非你有充分理由不这样做,否则只需使用this.a
即可。明确说明你的意图通常是有疑问的方式。节省一些按键很少值得在路上留下潜在的麻烦。
答案 1 :(得分:1)
演示使用a + b + c
function Obj(a, b, c) {
this.a = a;
this.b = b;
this.c = c;
this.addMe = function() {
console.log('addMe', this.a + this.b + this.c);
};
this.brokenAddMe = function() {
console.log('brokenAddMe', a + b + c);
};
}
var o = new Obj(1,2,3);
o.addMe(); // should be and is 6
o.brokenAddMe(); // should be and is 6
o.a = 4;
o.addMe(); // should be and is 9
o.brokenAddMe(); // should be 9 but still is 6

答案 2 :(得分:0)
按照您定义addMe
功能的方式,是的;您只需关闭a
,b
和c
即可使用它们。但问题是,这通常是定义方法的浪费方式,因为 Obj
的每个实例都将涉及构建新的addMe
函数。
通常,人们倾向于通过依赖ES6类语法或执行Obj.prototype.addMe = ...
将可重用方法附加到构造函数之外的原型。在这两种情况下,a
,b
和c
构造函数参数都不在范围内,因此您必须依赖this
中可用的属性。