Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.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
ECMAScript 5之前的Javascript-bind()/如何使用apply()或call()进行模拟?_Javascript_Binding_This_Ecmascript 5 - Fatal编程技术网

ECMAScript 5之前的Javascript-bind()/如何使用apply()或call()进行模拟?

ECMAScript 5之前的Javascript-bind()/如何使用apply()或call()进行模拟?,javascript,binding,this,ecmascript-5,Javascript,Binding,This,Ecmascript 5,刚刚遇到了一个绑定问题,这个问题就在我的Javascript领域的边缘,所以我将按照Regis的建议,讨论一下我的方法,并得出我的问题: function foo() { document.body.addEventListener("click", this.bar); } foo.prototype.bar = function(evt) { alert(this); } test = new foo(); 这将使用document.body元素发出警报,因为此由于函数

刚刚遇到了一个绑定问题,这个问题就在我的Javascript领域的边缘,所以我将按照Regis的建议,讨论一下我的方法,并得出我的问题:

function foo() {
    document.body.addEventListener("click", this.bar);
}

foo.prototype.bar = function(evt) {
    alert(this);
}

test = new foo();
这将使用
document.body
元素发出警报,因为
由于函数引用而丢失。因此,引用必须使用
bind()
来持久化引用:

function foo() {
    document.body.addEventListener("click", this.bar.bind(this));
}
这将使用类型为
foo
的预期对象发出警报



但是,据我所知,如果我使用
bind()
,那么一堆浏览器将无法发挥作用。我一直在阅读
apply()
call()
但它们似乎适用于带有参数的情况。在这种情况下,如何使用ECMAScript5之前的方法实现所需的
bind()
行为?

John Resig,我没有给出自己的答案。(点击1)我们的目标,然后点击下一步


Resig的解决方案来自prototype.js。您还可以看到MDN的描述和实现代码,近似于实际的ES5实现。不过,对于大多数目的来说,它应该已经足够好了。

(单击“我们的目标”,然后点击“下一步”。你将在那里看到答案。)也可以看到。酷豆人-非常有用。很高兴接受这个解决方案。