我试图通过在线视频课程来掌握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来阻止这种情况。
答案 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。