【问题标题】:jQuery set scope of methodjQuery设置方法的范围
【发布时间】:2016-08-09 21:06:56
【问题描述】:

我只是想知道这样的事情是否可以实现:

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

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>

使用此方法,我将“.myclass”元素的点击事件数据传递给app.foo,因此将执行面向对象的方法。

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

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

将被执行为:

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

这样的事情可能吗?

【问题讨论】:

  • 这些对你有用吗? (具体来说,app.foo?)
  • 是的,它基本上可以工作。我写的代码没有经过测试,只是为了让你明白我的意思而写出来的。
  • 那么请确保您发布有效代码而不是乱涂乱画。这段代码被破坏了,讨论它没有意义。
  • 现在它正在运行。你可以测试一下。

标签: jquery scope callback


【解决方案1】:

可以在激活时控制foo 函数的this 值:

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

this 设置为等于e.target,你会得到你描述的行为,但是......

这样做不是一个好习惯。首先,如果foo 绑定到特定的this(例如通过foo.bind(someContext),此方法将无法覆盖该上下文。其次,当没有真实的对象上下文时,拥有this 上下文是不自然的——就是这样函数参数用于。这个(通常在 jQuery 回调中发现)的“常见异常”是将上下文传递给“隔离”回调函数,而不是“对象方法”,即使这样也很难证明这一点,因为同样的原因,函数参数更清晰,更不脆弱。

【讨论】:

  • 所以.call(e.target) 定义了那里的范围,对吗?我基本上想要在点击回调和点击对象方法之间架起一座桥梁,这样我就可以安全地将整个点击事件回调传递给该对象方法。例如,某人有一个充满 $(this) 的方法(我知道,应该缓冲 - 不好的做法),他/她想将该方法直接复制到库中。那会很有用。
  • @TahaPaksu - 这通常会起作用,我只是认为这是不明智的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多