在这个例子中,为什么放弃“这个”是有益的

时间:2015-04-04 05:13:10

标签: javascript this

我试图通过在线视频课程来掌握Javascript的概念,我在下面的例子中看到了这个例子。 https://www.youtube.com/watch?v=9oi0NY8Pen8

教师首先使用了这个例子

var carlike = function(obj, loc) {
  obj.loc = loc;
  obj.move = function() {
    this.loc++;
  };
  return obj;
};

var amy = carlike({}, 1);
amy.move();

然后将carlike函数更改为

var carlike = function(obj, loc) {
  obj.loc = loc;
  obj.move = function() {
    obj.loc++;
  };
  return obj;
};

Instead of referring to the parameter this which gets bound to a new value each time move is invoked we can use obj

this如何绑定到新值。如何使用obj来阻止这种情况。

3 个答案:

答案 0 :(得分:3)

当您致电amy.move()时,在move内,“变量”this获取amy的值,这是一个对象。如果move包含代码this.loc++,则属性amy.loc的值将会增加。

但是,您可以通过其他方式调用该函数。例如:

var func = amy.move; // copies reference to function into variable func
func();              // "this" is unspecified

在上述情况下,由于this未指定,因此默认为window(非严格模式)或undefined(严格模式下)。

或者:

var bill = { loc: 4 };
amy.move.call(bill); // "this" is bill, not amy

另一方面,如果move函数包含代码obj.loc++,那么它将始终递增同一对象的loc:即传递给{{的carlike 1}}创建move的此实例时:

var amy = carlike({}, 1);
var bill = { loc: 4 };
amy.move.call(bill); // "this" is bill, not amy
console.log(amy.loc); // prints 2
console.log(bill.loc); // prints 4

move功能在创建后,会在obj内的局部变量carlike上变为closure

在这个小例子中,这样做并没有特别的好处,但是闭包是一般的强大技术。

答案 1 :(得分:2)

当您将移动功能调用为:

amy.move();

然后您将移动中的 this 的值设置为 amy 。如果你这样做:

var b = amy.move;
b();

您现在正在调用该函数而未设置 this ,因此它在非严格模式下默认为global / window对象,并且在严格模式下未定义。使用:

  obj.loc = loc;
  obj.move = function() {
    obj.loc++;
  };

然后该函数通过闭包保持对 obj 的引用,因此无论函数如何被调用, obj 总是引用最初传递给 carlike的对象

答案 2 :(得分:1)

因为javascript中的this是在函数调用时决定的。在方法内使用它会导致不必要的错误。如果您使用amy.move()自行调用该函数,则可能无法实现此目的。

前:

var carlike = function(obj, loc) {
  obj.loc = loc;
  obj.move = function() {
    console.log(this);
    this.loc++;
  };
  return obj;
};

var amy = carlike({}, 1);
amy.move(); => this will corresponds to object which are returned from constructor.

setTimeout(amy.move, 1000) => this will corresponds to window 

由于构造函数返回了对象,因此可以安全地在函数amy中使用obj。

参考:this in javascript