Javascript - "this"范围问题修复

标签 javascript callback scope this

我一直在尝试使用 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);

这给了我“Ann Other”。完美的!然而,如果我取消注释“this.fullName”行并注释掉“clientData.fullName”,我会得到“Not Set”,并且 window.fullName 将包含“Ann Other”(“this”的传统范围问题是附加到全局窗口)。

当然,这是一个原始的例子,但是这是不好的做法吗?现在这意味着我永远不会遇到在回调函数中访问本地属性的问题。我也不需要使用“call”或“apply”函数并传入对象引用,以便我可以在正确的范围下访问“this.propertyName”。任何答案将不胜感激。

最佳答案

是的,这是一种不好的做法。如果有支持,请使用 Function.prototype.bind :

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

(当您有原型(prototype)可以使用时,这就不那么多余了。)

或者,万无一失但不太漂亮的解决方案:

getUserInput("Ann", "Other", function(firstName, lastName) {
    clientData.setUserName(firstName, lastName);
});

额外的 ES6 模式(但如果你有 ES6,为什么不使用 bind?)

getUserInput("Ann", "Other", (...args) => clientData.setUserName(...args));

关于Javascript - "this"范围问题修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22048313/

相关文章:

javascript - 一次 POST Grails 中的所有传入参数

javascript - 如何仅在特定查询字符串上显示 div 元素?

javascript - 我可以在 jquery 中使用带有 .submit 的回调吗

javascript - 如何访问executeSql函数之外的变量

具有连续调用的 jquery 事件委托(delegate)变量范围

javascript - D3.js 负值折线图

javascript - 当包含在自定义可折叠 div 中时,Jquery Chosen 不显示数据占位符

接受任意数量的回调并存储结果的c++类方法

javascript - Nodejs如何在回调中访问全局val?

java - BukkitRunnable 中的 'this'