我认为这似乎很简单,但是我对调用,应用和绑定感到困惑。等
我有一个eventListener
red.addEventListener("click", function() {
j = 0;
userTurn();
})
我正在传递函数userTurn()
function userTurn() {
if (this === colors[pattern[j]]) {
console.log("correct")
j++;
}
else {
console.log('wrong');
}
我想要的就是this关键字,它应用于eventListener所在的元素,但是默认情况下是window对象。我很确定这是因为我没有将其绑定到eventListener,但是我无法弄清楚...
感谢您的帮助!
答案 0 :(得分:1)
在没有调用上下文的情况下调用的函数,例如您的
userTurn();
默认情况下,将其this
设置为全局(窗口)对象。要在指定自定义调用上下文的同时调用函数,请使用.call
,其第一个参数是您要设置的自定义this
值:
red.addEventListener("click", function() {
j = 0;
userTurn.call(this);
})
red.addEventListener("click", function() {
j = 0;
userTurn.call(this);
})
function userTurn() {
console.log(this.textContent);
}
<div id="red">red</div>
答案 1 :(得分:0)
为什么在呼叫userTurn();
时不通过
像userTurn(this);
然后将参数添加到函数中。
function userTurn(obj){
if (obj === colors[pattern[j]]) {
...
}
答案 2 :(得分:0)
// rename this to Map so that it complies with Java standards
public class Map extends JPanel implements ActionListener, KeyListener {
private static String IMAGE_PATH = "images/pennmap.jpg";
// ..... other code here
// JLabel background; // **** get rid of this ****
// ImageIcon img;
private BufferedImage backgroundImg;
// constructor needs to be re-named
public Map(){
backgroundImg = ImageIO.read(new File(IMAGE_PATH)); // read in image. Better to use resources though
// .... code here
// background = new JLabel(new ImageIcon("images/pennmap.jpg")); // again get rid of
// add (background); // get rid of
// .... code here
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroundImg, 0, 0, this); // draw image
g.setColor(new Color(9, 49, 98));
g.fillRect(x, y, 50, 30);
}
// .....
}
指的是this
window
。
所以在下面的功能中
object
function userTurn() {
if (this === colors[pattern[j]]) {
console.log("correct")
j++;
}
else {
console.log('wrong');
}
指的是窗口对象,因为函数this
没有附加到任何对象,而是附加到窗口对象。在下面的代码中,userTurn
是指触发事件的元素。
this
因此,在这种情况下,您可以从red.addEventListener("click", function() {
j = 0;
userTurn();
})
处理程序中传递this
的引用
click