gpt4 book ai didi

javascript - 为什么在此示例中放弃 'this' 是有益的

转载 作者:行者123 更新时间:2023-11-30 08:00:30 26 4
gpt4 key购买 nike

我正试图通过在线视频类(class)来掌握 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;
};

我们可以使用 obj 而不是引用每次调用 move 时绑定(bind)到新值的参数 this

this 如何绑定(bind)到新值。使用 obj 如何防止这种情况。

最佳答案

当您调用 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 的对象当 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函数在创建时变为 closure在局部变量上 objcarlike 内.

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

关于javascript - 为什么在此示例中放弃 'this' 是有益的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29442982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com