Javascript混淆了';这';内闭包函数
我试着在下面的函数中理解Javascript混淆了';这';内闭包函数,javascript,oop,scope,this,Javascript,Oop,Scope,This,我试着在下面的函数中理解这个关键字作用域global/private 我97%的理解。但是在x.private\u fa()的输出上陷入了困惑,它返回一个私有函数,但不返回其中的私有值 a=1.1; b=2.1; c=3.1; 函数fa(){ 返回“全局fa()”; } 函数f(){ var a=1; 这是b=2; 函数fa(){ 返回此.b;//或此.a不工作。。! //返回b//2.2 //返回a//1 } 返回{ 二等兵a:a,//1 全局_a:window.a,//1.1 privat
这个
关键字作用域global/private
我97%的理解。但是在x.private\u fa()
的输出上陷入了困惑,它返回一个私有函数,但不返回其中的私有值
a=1.1;
b=2.1;
c=3.1;
函数fa(){
返回“全局fa()”;
}
函数f(){
var a=1;
这是b=2;
函数fa(){
返回此.b;//或此.a不工作。。!
//返回b//2.2
//返回a//1
}
返回{
二等兵a:a,//1
全局_a:window.a,//1.1
private_b:this.b,//2
全局_b:b,//2.1
专用传真:fa(),//2.1
private_fa:fa,//函数private fa()
全局_fa:window.fa(),//全局fa()
全局_c:c,//3.1
二等兵:这个。c//3
};
}
试一试{
f、 原型c=3;
var x=新的f();
f、 原型c=4;
console.log(“x:,x”);
/*请解释一下*/
log(“x.private_fa():”,x.private_fa());
控制台日志(x.private_c);
var x1=新的f();
控制台日志(x1.private_c);
console.log(“-End-”);
}捕获(e){
控制台错误(“错误:”,即消息);
}
在您发布的代码中,对x.private\u fa()
的调用返回未定义的,仅仅因为对象x没有b
成员(而fa返回this.b
)
如果希望它返回该值,请让对象的private\u fa
返回绑定版本的“private”fa()
:
在bound\u fa
函数中,此
将永远绑定到f()
上下文(所需变量b
所属的位置)
这一阅读可以进一步澄清这个谜团:在进入函数之前将其分配给另一个变量,比如var b_internal=This.b
,然后在闭包中有b_internal
具有正确的值。如果您需要访问所有成员(并可能修改它们),则更好,对this
执行与var t=this
相同的操作,然后在闭包内返回t.b代码>这是因为此
将引用调用函数的上下文,而不是它的定义位置,并且您可以注意到在f
中返回的对象中没有a
或b
属性,其中调用了fa()
。您可以像Federico所说的那样将值存储在函数(闭包)中,另一种方法是使用ES6的arrow函数,该函数有一个“稳定的”this
,对应于函数定义的位置,不从构造函数返回一个对象,该构造函数使用new
调用。谢谢,这个答案看起来既专业又标准。
var bound_fa = fa.bind(this);
return {
private_a: a, // 1
global_a: window.a, // 1.1
private_b: this.b, // 2
global_b: window.b, // 2.1
private_fax: fa(), // 2.1
private_fa: bound_fa, // function private fa()
global_fa: window.fa(), // Global fa()
global_c: window.c, // 3.1
private_c: this.c // 3
};