jQuery设置方法范围

时间:2016-08-09 21:06:57

标签: jquery scope callback

我只是想知道是否可以实现这样的目标:

假设我的库中定义了一个事件回调:



var app = {
        globals: {
            foo: null
        },
        bar: function(e) {
            e.preventDefault();
            e.stopPropagation();
            if (typeof app.globals.foo === "function") app.globals.foo(e);
        },
        init: function(options) {
            $.extend(app.globals, options);
            $(".myclass").on("click", function(e) {
                app.bar(e);
            });
        }
    };

    $(document).ready(function() {
        app.init({
            foo: function(evt) {
                alert("clicked");
                console.log(evt.target);
            }
        });
    });

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="myclass">Click Me!</div>
&#13;
&#13;
&#13;

通过这种方法,我传递了&#34; .myclass&#34;元素&#39;单击事件数据到app.foo,因此将执行面向对象的方法。

TL; DR:问题是,我可以将foo的范围设置为发送click事件的对象吗?所以:

app.init({
   foo: function(){
       console.log(this);
   }
});

将执行与:

相同
app.init({
   foo: function(evt){
       console.log(evt.target);
   }
});

这样的事情可能吗?

1 个答案:

答案 0 :(得分:1)

可以控制激活时this功能的foo值:

// ...
if(typeof app.globals.foo === "function") app.globals.foo.call(e.target);
// ...

this设置为等于e.target并且您将获得您描述的行为,但是......

这样做不是一个好习惯。首先,如果foo绑定到特定的this(例如通过foo.bind(someContext),则此方法将无法覆盖该上下文。其次,拥有{{1}是不自然的当没有真正的对象上下文时,上下文 - 那是什么函数参数被使用。&#34;常见异常&#34;对此(通常在jQuery回调中找到)将上下文传递给一个&#34;隔离&#34;回调函数,而不是&#34;对象方法&#34;,即使这样,由于同样的原因很难证明这一点,函数参数更清晰,更不易碎