2012-12-20 102 views
6

我有一個變量mutedUser,我想堅持到另一個功能。我在點擊事件之外持續存在變量時遇到了一些問題。什麼是最好的方式,以便「返回mutedUser」將保持基於if語句條件的「靜音」字符串添加?謝謝!問題與JavaScript可變範圍

*本的console.log的是我檢查,看看那裏的持久性停止

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

是,如果在您檢查了NOT NULL和ID工作說法?此外,你可以這樣做,併發布結果: console.log(mutedUser +'muted1'); –

回答

5

如果我理解你正在試圖做的(通過查看代碼)是什麼,這將是最好的方法:

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

的代碼保留數組mutedUsersisUserMuted函數檢查提供的用戶是否在該數組中。在您所提供的代碼,你會附加一個新的事件處理程序,每次isUserMuted函數被調用..

isUserMuted功能甚至可以縮短爲:

this.isUserMuted = function isUserMuted(payload) { 
    return mutedUsers[payload.a] !== null ? ' muted' : ''; 
}; 
+0

這將會很好,但是我需要在this.isUserMuted函數範圍內的變量「chatUserID」。這是因爲,該變量基於一個點擊事件,該事件檢查在 – Yasir

+0

中加載的HTML中的屬性。在您的實現中,如果用戶確實被靜音,則「chatUserID」實際上等於「payload.a」(由您判斷if語句 - 'if(mutedUsers [chatUserID]!== null && mutedUsers [chatUserID] .i​​d === payload.a)'和這一行'mutedUsers [chatUserID] .i​​d = chatUserID;'裏面的點擊處理程序) –

+0

啊!這工作了一次,我設置它!=對比!== 感謝您的幫助! – Yasir

3

編輯

對不起,我錯了。另一種方式是在變量傳遞,即

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

其實你的原始版本更好。新版本不起作用。 –

+0

你知道你是對的。但我通常將其視爲模塊模式,即類似http://jsfiddle.net/VpAPP/ – redconservatory

+1

它只適用於返回對象而不是標量的情況。 –

2

你不能。如果你從函數返回一個字符串,它總是按值傳遞,即複製;它的價值不會再改變。您需要返回一個可以訪問局部變量的當前值的函數,或者一個屬性正在更改的對象。

正如你似乎已經有一個對象,選擇#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' : ''; 
    } 
}