JavaScript闭包可以';t访问外部变量

JavaScript闭包可以';t访问外部变量,javascript,nvd3.js,Javascript,Nvd3.js,我有这样一个代码,不知道为什么在传递给nv.addGraph()的匿名函数中,我不能从外部函数(如a、zcls或this.model)访问变量 功能(输出){ //这里您称之为“this”表示小部件实例。(@see Mylable.js) var zcls=this.getZclass(), uuid=this.uuid; //this.domAttrs_u3;()表示它将准备一些dom属性, //就像下面的伪代码一样 /* *class=“${zcls}${this.getSclass()}”

我有这样一个代码,不知道为什么在传递给nv.addGraph()的匿名函数中,我不能从外部函数(如a、zcls或this.model)访问变量

功能(输出){
//这里您称之为“this”表示小部件实例。(@see Mylable.js)
var zcls=this.getZclass(),
uuid=this.uuid;
//this.domAttrs_u3;()表示它将准备一些dom属性,
//就像下面的伪代码一样
/*
*class=“${zcls}${this.getSclass()}”id=“${uuid}”
*/
var a=this.domttrs_u2;();
向外推(fds);
nv.addGraph(函数(){
var chart=nv.models.multiBarChart()
.过渡期(350)
.reduceTexticks(true)//如果为“false”,则每个x轴标记标签
//将被渲染。
.rotateLabels(0)//旋转x轴标签的角度。
.showControls(true)//允许用户在“分组”和
//“堆叠”模式。
.groupSpacing(0.1)//每组钢筋之间的距离。
;
chart.xAxis.tickFormat(d3.format(',f');
chart.yAxis.tickFormat(d3.format(',.1f');
风险值数据=[{
钥匙:“一些钥匙”,
颜色:“#ff44ee”,
价值观:[{
x:1,
y:3
}, {
x:3,
y:4
}]
}]
d3.选择(“#图表svg”).datum(数据).call(图表);
//d3.选择('#chart svg').datum(this.model.data).call(chart);
var someData=this.model.data;
nv.utils.windowResize(图表更新);
收益表;
});

这个函数在ZKoss小部件中以某种方式被使用,因此在这个函数中可以访问它的属性,比如.model,但在内部匿名函数中是不可能的。我不知道它出了什么问题,我刚刚开始用JS编码。

内部匿名函数的作用域与它包含的函数的作用域相同

您可以考虑传递<代码> ZCLS,或者在您传递到代码> nv的函数中定义它。AdgDigabase<代码> < /P> MDN很好地解释了这一点:

您可以定义函数参数,然后按名称传递它。例如:

var fcnArg=function(){…}

nv.addGraph(fcnArg);

关于这一点的另一个很好的讨论可以在这里找到:
内部匿名函数的作用域与其包含的函数的作用域相同

您可以考虑传递<代码> ZCLS,或者在您传递到代码> nv的函数中定义它。AdgDigabase<代码> < /P> MDN很好地解释了这一点:

您可以定义函数参数,然后按名称传递它。例如:

var fcnArg=function(){…}

nv.addGraph(fcnArg);

关于这一点的另一个很好的讨论可以在这里找到:
内部匿名函数的作用域与其包含的函数的作用域相同

您可以考虑传递<代码> ZCLS,或者在您传递到代码> nv的函数中定义它。AdgDigabase<代码> < /P> MDN很好地解释了这一点:

您可以定义函数参数,然后按名称传递它。例如:

var fcnArg=function(){…}

nv.addGraph(fcnArg);

关于这一点的另一个很好的讨论可以在这里找到:
内部匿名函数的作用域与其包含的函数的作用域相同

您可以考虑传递<代码> ZCLS,或者在您传递到代码> nv的函数中定义它。AdgDigabase<代码> < /P> MDN很好地解释了这一点:

您可以定义函数参数,然后按名称传递它。例如:

var fcnArg=function(){…}

nv.addGraph(fcnArg);

关于这一点的另一个很好的讨论可以在这里找到:

在闭包中,您不能访问
a
zcls
,但这样做应该没有问题

对于
this
,它始终是由函数调用方设置的函数本地引用。如果要访问父函数查看的
this
,则需要将其复制到本地变量,例如

var that = this;
在父类中,然后在闭包中引用
that
而不是
this
,或者,您也可以对传入此函数的函数调用
bind()
,例如

nv.addGraph(function () {
   ...
}.bind(this));

这将导致函数中的
this
与父函数中的
this

的值相同。您在闭包中不访问
a
zcls
,但这样做应该没有问题

对于
this
,它始终是由函数调用方设置的函数本地引用。如果要访问父函数查看的
this
,则需要将其复制到本地变量,例如

var that = this;
在父类中,然后在闭包中引用
that
而不是
this
,或者,您也可以对传入此函数的函数调用
bind()
,例如

nv.addGraph(function () {
   ...
}.bind(this));

这将导致函数中的
this
与父函数中的
this

的值相同。您在闭包中不访问
a
zcls
,但这样做应该没有问题

对于
this
,它始终是由函数调用方设置的函数本地引用。如果要访问父函数查看的
this
,则需要将其复制到本地变量,例如

var that = this;
在父类中,然后在闭包中引用
that
而不是
this
,或者,您也可以对传入此函数的函数调用
bind()
,例如

nv.addGraph(function () {
   ...
}.bind(this));

这将导致函数中的
this
与父函数中的
this

的值相同。您在闭包中不访问
a
zcls
,但这样做应该没有问题

对于
this
,它始终是由函数调用方设置的函数本地引用。如果您希望在查看时访问
this