Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript混淆了';这';内闭包函数_Javascript_Oop_Scope_This - Fatal编程技术网

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
};