我有一个函数,myfunc并希望将bind它作为一个特定的this参数和其他参数bind作为单个数组,而不是参数列表(因为我将参数列表作为函数的参数,执行此代码).为此目的,我使用apply上bind,如下所示:
var myfunc = function(arg1, arg2){
alert("this = " + this + ", arg1 = " + arg1 + ", arg2 = " + arg2);
}
var bindedMyfunc = myfunc.bind.apply("mythis", ["param1", "param2"]);
bindedMufunc();
Run Code Online (Sandbox Code Playgroud)
这导致了Uncaught TypeError: Bind must be called on a function.
我究竟做错了什么?你能否详细解释一下,当我运行这段代码时会发生什么,导致现实似乎与我的看法相矛盾?
答案摘要:
似乎它bind本身有自己的this参数,它是函数,它被调用.例如,当你说myfunc.bind(args),bind的this是myfunc.
通过调用apply上bind我已经mistakingly分配bind的这'mythis’,这是不是一个功能,bind不能在叫. …
我有一些示例代码绑定事件处理程序,如下所示:
var h1=document.querySelector('h1');
h1.onclick=doit;
function doit(x) {
console.log(x);
}
Run Code Online (Sandbox Code Playgroud)
触发事件处理程序时(通过单击h1元素),输出是一个event对象,如预期的那样.
如果我绑定事件处理程序如下:
h1.onclick=doit.bind(h1);
Run Code Online (Sandbox Code Playgroud)
我得到了相同的结果.
但是,如果我按如下方式绑定它:
h1.onclick=doit.bind(h1,1);
Run Code Online (Sandbox Code Playgroud)
我得到了1,之后的第一个参数h1.在所有情况下,vallue都this被正确设置为h1,但在最后一种情况下,传递的参数似乎替换了预期的事件对象.
如何在不将事件处理程序重写为函数表达式的情况下保留事件对象?
javascript events event-listener function-binding eventhandler
这是一个解释我的问题的片段:
+function(str) {
return str.replace(/^[a-z]|\s[a-z]/g,
Function.call.bind(String.prototype.toUpperCase));
}('foo bar baz.'); //Returns Foo Bar Baz.
Run Code Online (Sandbox Code Playgroud)
Function.call有效,但String.toUpperCase没有.我不得不写String.prototype.toUpperCase.
在此,绑定运营商是为了方便的提案this为ES7方法绑定语法:
// this-bind via '::'
$(".some-link").on("click", ::view.reset);
// oldschool .bind(this, ...)
$(".some-link").on("click", view.reset.bind(view))
// or even longer...
$(".some-link").on("click", function () {
return view.reset.apply(view, Array.prototype.slice.call(arguments));
})
// and even ES6 while is more handy, but still leaves some redundancy
$(".some-link").on("click", (...args) => view.reset(...args));
Run Code Online (Sandbox Code Playgroud)
问题是,它仍处于未来(7)版ES的提案阶段,因此它尚未包含在标准中,因此不受ESLint的支持,同时仍然可以通过tanspiling(与Babel,fe)一起使用.
问题是,ESLint是否有任何模块/插件/选项支持函数绑定操作符(或整套ES7实验特性)语法?
在准备Java认证考试时,我很惊讶地发现Java允许这样:
public class Consumer {
public void buy(Object o) {
System.out.println("Buying one object");
}
public void buy(Object... o) {
System.out.println("Buying multiple objects");
}
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.buy(new Object());
consumer.buy("a String");
}
}
Run Code Online (Sandbox Code Playgroud)
这个类编译并运行良好.它打印两次"购买一个对象".实际上我认为会看到编译器错误,因为可以使用这两个函数.编译器如何在此处选择最佳匹配函数?当我只传递一个参数时,它会不会总是选择非varargs函数?