2017-04-12 40 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