Javascript-“;这";范围问题修复

Javascript-“;这";范围问题修复,javascript,callback,scope,this,Javascript,Callback,Scope,This,我一直在玩Javascript回调,了解“this”的范围问题,以及如何通过使用“call”或“apply”并传递对象引用来消除它 然而,我发现了一些东西,我想知道下面的做法是否不好?因为它通过纯粹使用对象名而不是“this”来消除范围问题。假设我有一个具有回调的函数,例如: function getUserInput(firstName, lastName, callback) { callback(firstName, lastName); } 像这样的物体: var clientD

我一直在玩Javascript回调,了解“this”的范围问题,以及如何通过使用“call”或“apply”并传递对象引用来消除它

然而,我发现了一些东西,我想知道下面的做法是否不好?因为它通过纯粹使用对象名而不是“this”来消除范围问题。假设我有一个具有回调的函数,例如:

function getUserInput(firstName, lastName, callback) {
   callback(firstName, lastName);
}
像这样的物体:

var clientData = {
  id: 1,
  fullName: "Not Set",
  setUserName: function (firstName, lastName) {
  //this.fullName = firstName + " " + lastName;
  clientData.fullName = firstName + " " + lastName;
  }
}
要执行并查看代码的输出,我执行以下操作:

 getUserInput("Ann", "Other", clientData.setUserName);

 console.log(clientData.fullName);
这给了我“另一个安”。完美的然而,如果我取消对“this.fullName”行的注释并注释掉“clientData.fullName”,我将得到“notset”,window.fullName将包含“annother”(传统的作用域问题“this”被附加到全局窗口)


诚然,这是一个原始的例子,但这是一个糟糕的做法吗?现在这意味着在回调函数中访问本地属性从来没有问题。我也不需要使用“call”或“apply”函数并传入对象引用,这样我就可以在正确的范围下访问“this.propertyName”。任何答案都将不胜感激。

是的,这是一种不好的做法。如果得到支持,请使用:

(当您有一个原型可供使用时,这会减少冗余。)

或者,简单但不太漂亮的解决方案:

getUserInput("Ann", "Other", function(firstName, lastName) {
    clientData.setUserName(firstName, lastName);
});
额外的ES6模式(但如果您有ES6,为什么不使用
bind
?)


是的,这是一种坏习惯。如果得到支持,请使用:

(当您有一个原型可供使用时,这会减少冗余。)

或者,简单但不太漂亮的解决方案:

getUserInput("Ann", "Other", function(firstName, lastName) {
    clientData.setUserName(firstName, lastName);
});
额外的ES6模式(但如果您有ES6,为什么不使用
bind
?)


是的,这是一种坏习惯。如果得到支持,请使用:

(当您有一个原型可供使用时,这会减少冗余。)

或者,简单但不太漂亮的解决方案:

getUserInput("Ann", "Other", function(firstName, lastName) {
    clientData.setUserName(firstName, lastName);
});
额外的ES6模式(但如果您有ES6,为什么不使用
bind
?)


是的,这是一种坏习惯。如果得到支持,请使用:

(当您有一个原型可供使用时,这会减少冗余。)

或者,简单但不太漂亮的解决方案:

getUserInput("Ann", "Other", function(firstName, lastName) {
    clientData.setUserName(firstName, lastName);
});
额外的ES6模式(但如果您有ES6,为什么不使用
bind
?)


在对象的方法中引用对象的名称肯定不是一个好的做法,因为如果更改对象的名称,则应该更改方法的实现

我建议您使用:

 getUserInput("Ann", "Other", clientData.setUserName.bind(clientData));

 console.log(clientData.fullName);
发生此问题的原因是调用回调
回调(firstName,lastName)
操作符的code>,该操作符将方法调用与特定上下文关联

bind
是ES5的一部分,如果您希望获得更广泛的浏览器兼容性,可以:

 getUserInput("Ann", "Other", function (data) {
     clientData.setUserName.apply(clientData, arguments);
 });

 console.log(clientData.fullName);

在对象的方法中引用对象的名称肯定不是一个好的做法,因为如果更改对象的名称,则应该更改方法的实现

我建议您使用:

 getUserInput("Ann", "Other", clientData.setUserName.bind(clientData));

 console.log(clientData.fullName);
发生此问题的原因是调用回调
回调(firstName,lastName)
操作符的code>,该操作符将方法调用与特定上下文关联

bind
是ES5的一部分,如果您希望获得更广泛的浏览器兼容性,可以:

 getUserInput("Ann", "Other", function (data) {
     clientData.setUserName.apply(clientData, arguments);
 });

 console.log(clientData.fullName);

在对象的方法中引用对象的名称肯定不是一个好的做法,因为如果更改对象的名称,则应该更改方法的实现

我建议您使用:

 getUserInput("Ann", "Other", clientData.setUserName.bind(clientData));

 console.log(clientData.fullName);
发生此问题的原因是调用回调
回调(firstName,lastName)
操作符的code>,该操作符将方法调用与特定上下文关联

bind
是ES5的一部分,如果您希望获得更广泛的浏览器兼容性,可以:

 getUserInput("Ann", "Other", function (data) {
     clientData.setUserName.apply(clientData, arguments);
 });

 console.log(clientData.fullName);

在对象的方法中引用对象的名称肯定不是一个好的做法,因为如果更改对象的名称,则应该更改方法的实现

我建议您使用:

 getUserInput("Ann", "Other", clientData.setUserName.bind(clientData));

 console.log(clientData.fullName);
发生此问题的原因是调用回调
回调(firstName,lastName)
操作符的code>,该操作符将方法调用与特定上下文关联

bind
是ES5的一部分,如果您希望获得更广泛的浏览器兼容性,可以:

 getUserInput("Ann", "Other", function (data) {
     clientData.setUserName.apply(clientData, arguments);
 });

 console.log(clientData.fullName);

“数据”参数确实不需要吗?因为参数param为setUserName函数提供了值?是的,我喜欢bind方法,它很有意义。我只是好奇,因为我偶然发现的东西工作得非常好,并且理解如果方法名称更改,我将不得不重新命名(在某些方面,这是一个不太可能但很容易的更改)。我也很感激能在上下文对象中使用“apply”或“call”并传递。还有另一种访问属性的方法,可以避免设置“self=this;”属性的范围问题。然后通过object.self.propertyName访问属性。我只是好奇,考虑到这可能是一个非常被误解的领域,“数据”参数确实不是真的需要吗?因为参数param为setUserName函数提供了值?是的,我喜欢bind方法,它很有意义。我只是好奇,因为我偶然发现的东西工作得非常好,并且理解如果方法名称更改,我将不得不重新命名(在某些方面,这是一个不太可能但很容易的更改)。我也很感激能在上下文对象中使用“apply”或“call”并传递。还有另一种访问属性的方法,可以避免设置“self=this;”属性的范围问题。然后通过object.self.propertyName访问属性。我只是好奇,考虑到这可能是一个非常被误解的领域,“数据”参数确实不是真的需要吗?因为参数param为setUserName函数提供了值?是的,我喜欢bind方法,它很有意义。我只是好奇,因为我偶然发现了什么