2017-04-12 34 views
0

我寫了一個將行爲綁定到元素的函數。假設我們有兩個輸入。然後,我們希望能夠展示這些輸入這樣的提示,全局範圍函數如何確定變量不再活動?

function ElementHinter(element){ 
    element.showNotice = function(message, type) { 
    var errorBorderStyle = "1px solid #cc3e22"; 
    var warningBorderStyle = "1px solid #cc9322"; 

    var parent = element.parents('.value'); 
    element.css("border", type == element.ERROR ? errorBorderStyle : warningBorderStyle); 
    if (!parent.find('.error-message').length) { 
     messagePublisher(message, type); 
    } 
    } 

    element.removeNotice = function() { 
    element.css("border-color", "#aaa #c8c8c8 #c8c8c8 #aaa"); 
    element.parents('.value').find('.error-message').remove(); 
    } 


    var messagePublisher = function(message, type) { 
    var parent = element.parents('.value'); 
    var errorStyle = "#cc3e22"; 
    var warningStyle = "#cc9322"; 

    var html = "<span class='error-message'>" + message + "</span>"; 
    parent.css("color", type == ElementHinter.ERROR ? errorStyle : warningStyle); 
    jQuery(parent).append(html); 
    } 
    return element; 
} 

ElementHinter.ERROR = "ERROR" 
ElementHinter.WARNING = "WARNING" 

var priceElement = ElementHinter($('input#price')); 
var discountPercent = ElementHinter($('input#discount')); 

priceElement.showNotice("Bad price friend",ElementHinter.WARNING); 
discountPercent.showNotice("Bad discount friend",ElementHinter.WARNING); 

現在,如果我得到的messagePublisher擺脫var的兩個通知將在只是一個元素顯示。爲什麼會發生?如果我擺脫varelement在這種情況下意味着什麼?

+0

你明白全局變量是什麼嗎? – dfsq

+0

檢查[Javascript中的變量範圍](https://docs.microsoft.com/en-us/scripting/javascript/advanced/variable-scope-javascript)。 – Oen44

+0

@dfsq是的,我這樣做,問題是什麼時候函數是全局的如何解釋元素。 – shampoo

回答

1

沒有var,變量變爲global。因此,如果沒有var,則只有一個messagePublisher變量,並且它由所有實例共享。這是因爲如果你有以下聲明:

var messagePublisher; 

你的函數。

如果你的發言開始你的腳本文件或功能的習慣得到:

"use strict"; 

(完全一樣),那麼你會得到一個錯誤,如果你省略var(或letconst在較新的JavaScript中)。

+0

謝謝。所以,這是一種不好的做法吧?你認爲這個想法總體上好嗎?在這樣的元素上綁定行爲? – shampoo

+1

@shampoo好了,在這種情況下,你沒有真正綁定到*元素*,你綁定到一個jQuery對象。另一種方法是創建這些函數作爲你自己的jQuery擴展,它可以讓你編寫'$(「input#price」)。showNotice();' – Pointy