Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将参数传递给绑定函数?_Javascript_Oop_Bind - Fatal编程技术网

Javascript 如何将参数传递给绑定函数?

Javascript 如何将参数传递给绑定函数?,javascript,oop,bind,Javascript,Oop,Bind,我正在努力实现以下目标: document.onload = init(); function Dropdown(dd) { this.dd = dd; this.exapnded = false; this.list = dd.querySelector('.list'); this.changeState = changeState.bind(this); this.dd.addEventListener('click', this.changeS

我正在努力实现以下目标:

document.onload = init();

function Dropdown(dd) {
    this.dd = dd;
    this.exapnded = false;
    this.list = dd.querySelector('.list');

    this.changeState = changeState.bind(this);
    this.dd.addEventListener('click', this.changeState(event));
}

function changeState(e) {
    if(this.expanded == true) {
        this.list.style.display = 'none';
        this.expanded = false;
        e.stopPropagation();
    }
    else {
        this.list.style.display = 'block';
        this.expanded = true;
        e.stopPropagation();
    }
}

function init() {
    let ddCollection = document.getElementsByClassName('dropdown');

    Array.from(ddCollection)
        .forEach(function(ddElement) {
            let dropdown = new Dropdown(ddElement);
            console.log(dropdown);
        }
    );
}
当然,对于我所写的糟糕的Javascript代码,当我试图执行上述代码时,它失败了

Uncaught TypeError: this.list is undefined
这意味着无论我做什么,都不会将我的
这个
对象绑定到changeState函数

如果我尝试以下方法,结果也不会改变

this.dd.addEventListener('click', changeState(event).bind(this));
在这种情况下,我如何实现它?请回答


我一直在挠头,尝试StackOverflow上所有可能的解决方案,但似乎没有任何效果。我希望我已经恰当地表达了我的问题。如果需要进一步说明,请在下面添加注释。

您只需将函数附加到
下拉列表中即可。prototype
而不是将其附加到对象实例:

Dropdown.prototype.changeState = function (e) {
    if (this.expanded == true) {
        this.list.style.display = 'none';
        this.expanded = false;
        e.stopPropagation();
    } else {
        this.list.style.display = 'block';
        this.expanded = true;
        e.stopPropagation();
    }
};
另外,像这样编写事件侦听器,否则您将立即调用该函数,而不是注册它以供将来的单击反应

this.dd.addEventListener('click', event => this.changeState(event));

您是否已调试以查看此
的值?其次,您是否调试过
dd.querySelector('.list')
的值?您的问题也令人困惑,因为在标题中,您询问的是如何将参数传递给绑定函数,而在问题本身中,您询问的是绑定
this