没有构造函数的情况下如何给“ this”赋值

时间:2018-07-29 03:46:44

标签: javascript function this

我认为这似乎很简单,但是我对调用,应用和绑定感到困惑。等

我有一个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,但是我无法弄清楚...

感谢您的帮助!

3 个答案:

答案 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