标签: function-binding

Function.prototype.bind.apply()无法按预期工作

我有一个函数,myfunc并希望将bind它作为一个特定的this参数和其他参数bind作为单个数组,而不是参数列表(因为我将参数列表作为函数的参数,执行此代码).为此目的,我使用applybind,如下所示:

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),bindthismyfunc.

通过调用applybind我已经mistakingly分配bind的这'mythis’,这是不是一个功能,bind不能在叫. …

javascript functional-programming function-binding

4
推荐指数
1
解决办法
2474
查看次数

绑定和事件处理程序 - 传递事件对象

我有一些示例代码绑定事件处理程序,如下所示:

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

4
推荐指数
1
解决办法
2397
查看次数

Javascript:为什么我能在不提及原型的情况下访问Function.prototype.call?

这是一个解释我的问题的片段:

+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.

javascript prototypal-inheritance function-binding

2
推荐指数
1
解决办法
91
查看次数

ESLint和This-Bind运算符

此,绑定运营商是为了方便的提案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实验特性)语法?

javascript function-binding eslint ecmascript-next

1
推荐指数
1
解决办法
1652
查看次数

Java:允许使用一个varargs参数和具有相同名称的函数和一个相同类型的参数的函数?

在准备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函数?

java overloading variadic-functions function-binding

1
推荐指数
1
解决办法
757
查看次数