Javascript变量范围问题
我有一个变量mutedUser,我希望它能持久化到另一个函数。我在click事件外部持久化变量时遇到了一些问题。根据if语句的条件,“return mutedUser”保持“muted”字符串加法的最佳方式是什么?谢谢 *console.log让我检查持久性停止的位置Javascript变量范围问题,javascript,function,variables,scope,Javascript,Function,Variables,Scope,我有一个变量mutedUser,我希望它能持久化到另一个函数。我在click事件外部持久化变量时遇到了一些问题。根据if语句的条件,“return mutedUser”保持“muted”字符串加法的最佳方式是什么?谢谢 *console.log让我检查持久性停止的位置 this.isUserMuted = function isUserMuted(payload) { var mutedUser = ''; // If mute button is clicked place them
this.isUserMuted = function isUserMuted(payload) {
var mutedUser = '';
// If mute button is clicked place them into muted users list
// check for duplicates in list
$("#messages-wrapper").off('click', '.message button.muteButton');
$("#messages-wrapper").on('click', '.message button.muteButton', function(e) {
$('#unMute').show();
//create userId reference variable
var chatUserID = parseInt($(this).parent().parent().attr("data-type"));
//store userId in muted user object
mutedUsers[chatUserID] = {};
mutedUsers[chatUserID].id = chatUserID;
mutedUsers[chatUserID].muted = true;
if (mutedUsers[chatUserID] !== null && mutedUsers[chatUserID].id === payload.a) {
console.log("user is now muted");
mutedUser += ' muted';
console.log(mutedUser + 1);
}
console.log(mutedUser + 2);
});
return mutedUser;
};
编辑
对不起,我弄错了。另一种方法是传入该变量,即
this.isUserMuted = function isUserMuted(payload, isMuted) {
isMuted = '';
// If mute button is clicked place them into muted users list
// check for duplicates in list
$("#messages-wrapper").off('click', '.message button.muteButton');
$("#messages-wrapper").on('click', '.message button.muteButton', function(e) {
$('#unMute').show();
//create userId reference variable
var chatUserID = parseInt($(this).parent().parent().attr("data-type"));
//store userId in muted user object
mutedUsers[chatUserID] = {};
mutedUsers[chatUserID].id = chatUserID;
mutedUsers[chatUserID].muted = true;
if (mutedUsers[chatUserID] !== null && mutedUsers[chatUserID].id === payload.a) {
console.log("user is now muted");
isMuted += ' muted';
console.log(mutedUser + 1);
}
console.log(mutedUser + 2);
});
return isMuted;
};
如果我(通过查看代码)理解了您的意图,这将是最好的方法:
// If mute button is clicked place them into muted users list
// check for duplicates in list
$("#messages-wrapper").off('click', '.message button.muteButton');
$("#messages-wrapper").on('click', '.message button.muteButton', function(e) {
$('#unMute').show();
//create userId reference variable
var chatUserID = parseInt($(this).parent().parent().attr("data-type"));
//store userId in muted user object
mutedUsers[chatUserID] = {};
mutedUsers[chatUserID].id = chatUserID;
mutedUsers[chatUserID].muted = true;
});
this.isUserMuted = function isUserMuted(payload) {
var mutedUser = '';
if (mutedUsers[payload.a] !== null) {
mutedUser += ' muted';
}
return mutedUser;
};
代码保留mutedUsers
数组,并且isUserMuted
函数检查提供的用户是否在该数组中。在您提供的代码中,您将在每次调用isusermute
函数时附加一个新的事件处理程序
isusermute
功能甚至可以缩短为:
this.isUserMuted = function isUserMuted(payload) {
return mutedUsers[payload.a] !== null ? ' muted' : '';
};
你不能。如果您从函数返回字符串,它将始终按值传递,即复制;它的价值不会再改变了。您需要返回一个可以访问局部变量当前值的函数,或者返回一个属性正在更改的对象 由于您似乎已经有了一个对象,选项2将非常适合这里:
function User() { // or whatever you have
…
var user = this;
// If mute button is clicked place them into muted users list
// check for duplicates in list
$("#messages-wrapper").on('click', '.message button.muteButton', function(e) {
$('#unMute').show();
//store userId in muted user object
mutedUsers[user.id] = user;
user.muted = true;
});
this.muted = false;
this.isUserMuted = function() {
return this.muted ? ' muted' : '';
}
}
事实上,你原来的版本更好。新版本不行,你知道你是对的。但我通常将其视为一种模块模式,也就是说,类似这样的东西帮助我更好地理解了这个问题,这将非常有效,但是我需要在这个.isUserMuted函数的范围内使用变量“chatUserID”。这是因为,该变量基于一个单击事件,该事件检查在您的实现中加载的HTML中的一个属性,
chatUserID
实际上等于payload.a
if用户确实被静音(根据您的if语句判断-if(mutedUsers[chatUserID]!==null&&mutedUsers[chatUserID].id==payload.a)
这一行mutedUsers[chatUserID].id=chatUserID;
在单击处理程序中)啊!一旦我将其设置为vs.!==谢谢你的帮助!没问题。我很高兴我能帮助你!检查NOTNULL和id的if语句是否有效?此外,您还可以这样做并发布结果:console.log(mutedUser+'muted1');