【发布时间】:2017-11-16 11:26:37
【问题描述】:
我尝试了下面的函数来理解this关键字作用域全局/私有。
我理解了 97%。但对 x.private_fa() 的输出感到困惑,该输出返回一个私有函数,但不返回其中的私有值。
a = 1.1;
b = 2.1;
c = 3.1;
function fa() {
return "Global fa()";
}
function f() {
var a = 1;
this.b = 2;
function fa() {
return this.b; // or this.a not working..!
//return b // 2.2
//return a // 1
}
return {
private_a: a, // 1
global_a: window.a, // 1.1
private_b: this.b, // 2
global_b: b, // 2.1
private_fax: fa(), // 2.1
private_fa: fa, // function private fa()
global_fa: window.fa(), // Global fa()
global_c: c, // 3.1
private_c: this.c // 3
};
}
try {
f.prototype.c = 3;
var x = new f();
f.prototype.c = 4;
console.log("x:", x);
/*??? Please explain this.. ??? */
console.log("x.private_fa():", x.private_fa());
console.log(x.private_c);
var x1 = new f();
console.log(x1.private_c);
console.log(" - End - ");
} catch (e) {
console.error("Error: ", e.message);
}
【问题讨论】:
-
在进入函数之前将其分配给另一个变量,例如
var b_internal = this.b,然后在闭包内你有b_internal,它具有正确的值。 -
更好的是,如果您需要访问所有成员(并且可能修改它们),对
this和var t = this执行相同操作,然后在闭包内return t.b; -
这是因为
this将引用函数调用的上下文而不是定义它的位置,您可以注意到您的对象中没有a或b属性返回f,其中调用了fa()。您可以像 Federico 所说的那样将值存储在函数(闭包)中,另一种方法是使用 ES6 的箭头函数,它有一个“稳定的”this,对应于函数的定义位置 -
不要
return来自使用new调用的构造函数的对象。
标签: javascript oop scope this