事件处理程序之间的一个$ this赋值

时间:2015-04-21 13:12:49

标签: javascript jquery performance

我有一小段代码:

if (PZ_APP.dom.isAnyDomElement($textInputs)){
    $textInputs.on("focus", function(){
        var $this = $(this),
            placeholder = $this.attr('data-placeholder') || "Wpisz tekst...";
        if ($this.val() === placeholder){
            $this.val("");
        }
    }).blur(function(){
        var $this = $(this),
            placeholder = $this.attr('data-placeholder');
        if ($this.val() === ""){
            $this.val(placeholder);
        }
    });

我可以在事件处理程序之间避免多个var $ this = $(this)赋值吗?

2 个答案:

答案 0 :(得分:1)

鉴于$textInputs似乎与多个元素匹配,并且您需要this作为事件实际触发的元素:

没有。 this只能在每个函数中获得正确的值。

答案 1 :(得分:1)

如果您想进行优化(仅计算一次),按照@ Quentin的答案,那么没有。但是如果你想为风格目的而做,你可以,但它不是更好......

  function aopPreface(fn) {
    return function() {
      fn.call(this, $(this));
    };
  };

  if (PZ_APP.dom.isAnyDomElement($textInputs)){
    $textInputs.on("focus", aopPreface(function($this){
      var placeholder = $this.attr('data-placeholder') || "Wpisz tekst...";
      if ($this.val() === placeholder){
        $this.val("");
      }
    })).blur(aopPreface(function($this){
      var placeholder = $this.attr('data-placeholder');
      if ($this.val() === ""){
        $this.val(placeholder);
      }
    }));
  }

我并不是在这种情况下提倡这一点,因为IMO并不是更清晰,更清晰或更快,但如果你最终在一组函数调用之前或之后做了很多相同的事情,那么模式就是一个非常有用的重构工具。 (在您的情况下,占位符变量也可以移动。