如何引用JavaScript函数中的不同位置
我试图从JavaScript中的其他函数中访问设置和值/函数,我相信可能有一个简单的规则我没有。下面是一个非常简化的代码示例:如何引用JavaScript函数中的不同位置,javascript,oop,encapsulation,Javascript,Oop,Encapsulation,我试图从JavaScript中的其他函数中访问设置和值/函数,我相信可能有一个简单的规则我没有。下面是一个非常简化的代码示例: function h(){ // example settings I want to declare for h() this.settings = { critical: 400, readCritical: function(){ return this.settings.critical;
function h(){
// example settings I want to declare for h()
this.settings = {
critical: 400,
readCritical: function(){
return this.settings.critical; // /!\ but this does not work
}
}
this.hsub = function(){
return this.settings.critical; // /!\ this does not work either
}
}
var x = new h();
console.log(x.settings.critical); // This works fine
console.log(x.settings.readCritical()); // I can *call* this fine, but it can't read outside itself
console.log(x.hsub()); // I can also call this but same problem
console.log(h.settings); // `undefined`; I understand I can't see directly into the function
您可以看到this.settings.critical
值,我正试图从相应的函数readCritical
和hsub
中访问该值。我该怎么做?特别是从实例化的x
这也是第二个问题,但与此相关,我更愿意声明
var settings={}
,而不是this.settings
。这是可能的还是可取的 啊,另一个古老的经典闭包问题
有两种解决方法:
function h(){
var self = this;
this.settings = {
critical: 400;
readCritical: function() {
return self.settings.critical(); // otherwise this.settings will 'cover' `this`.
}
}
}
readCritical: () => this.settings.critical(); // arrow functions won't form a function scope
啊,另一个古老的经典闭包问题 有两种解决方法:
function h(){
var self = this;
this.settings = {
critical: 400;
readCritical: function() {
return self.settings.critical(); // otherwise this.settings will 'cover' `this`.
}
}
}
readCritical: () => this.settings.critical(); // arrow functions won't form a function scope
您需要做的唯一更改是从
readCritical
功能中删除.settings
hsub
按原样工作。不知道你为什么认为有问题
函数h(){
此参数。设置={
临界值:400,
readCritical:function(){
返回this.critical;//直接引用'critical'
}
}
this.hsub=函数(){
返回this.settings.critical;//这很好用
}
}
var x=新的h();
console.log(x.settings.critical);//400
console.log(x.settings.readCritical());//400
console.log(x.hsub());//400
//预计这是`未定义的'`
console.log(h.settings)
您需要做的唯一更改是从readCritical
功能中删除.settings
hsub
按原样工作。不知道你为什么认为有问题
函数h(){
此参数。设置={
临界值:400,
readCritical:function(){
返回this.critical;//直接引用'critical'
}
}
this.hsub=函数(){
返回this.settings.critical;//这很好用
}
}
var x=新的h();
console.log(x.settings.critical);//400
console.log(x.settings.readCritical());//400
console.log(x.hsub());//400
//预计这是`未定义的'`
console.log(h.settings)代码>这个
的范围(以及设置它的绑定函数)是JS中经常讨论的话题。然而,您似乎并不是专门寻找这个
,而是共享变量,还有另一种选择。总而言之,没有最好的答案,但是因为您还想声明var settings={}
:您实际上可以并且可以访问其他函数中可用的局部变量
函数h(){
var settings={//var settings是函数h(或其实例)的一个局部变量。如果允许ES6,则首选“let”或“const”
临界值:400,
readCritical:function(){
返回设置.critical;
}
};
this.settings=settings;//this.settings与var settings不是同一变量,因此该语句有效
this.hsub=函数(){
return settings.critical;//使用本地(var)设置
}
}
var x=新的h();
console.log(x.settings.critical);
console.log(x.settings.readCritical());
console.log(x.hsub())代码>这个
的范围(以及设置它的绑定函数)是JS中经常讨论的话题。然而,您似乎并不是专门寻找这个
,而是共享变量,还有另一种选择。总而言之,没有最好的答案,但是因为您还想声明var settings={}
:您实际上可以并且可以访问其他函数中可用的局部变量
函数h(){
var settings={//var settings是函数h(或其实例)的一个局部变量。如果允许ES6,则首选“let”或“const”
临界值:400,
readCritical:function(){
返回设置.critical;
}
};
this.settings=settings;//this.settings与var settings不是同一变量,因此该语句有效
this.hsub=函数(){
return settings.critical;//使用本地(var)设置
}
}
var x=新的h();
console.log(x.settings.critical);
console.log(x.settings.readCritical());
console.log(x.hsub())代码>看起来您只想要一个实例。如果是这样,那么只需使用对象文字符号立即创建实例:
var h={
设置:{
临界值:400,
readCritical:function(){
返回此文件。关键;
}
},
hsub:function(){
返回此.settings.critical;
}
}
console.log(h.settings.critical);
log(h.settings.readCritical());
console.log(h.hsub());
console.log(h.settings)代码>看起来您只想要一个实例。如果是这样,那么只需使用对象文字符号立即创建实例:
var h={
设置:{
临界值:400,
readCritical:function(){
返回此文件。关键;
}
},
hsub:function(){
返回此.settings.critical;
}
}
console.log(h.settings.critical);
log(h.settings.readCritical());
console.log(h.hsub());
console.log(h.settings)
您希望h.settings
返回什么?您认为所有实例的设置完全相同吗?因为现在有些实例可以区分为x.settings.critical=200
。那么你有一些是200,一些是400,那么关键的是什么呢?另外,为什么您更喜欢var设置
?然后您将如何公开settings
?有很多问题,但是h.settings
是一个对象,不应该返回任何内容-但是我想要x.settings.something