在Javascript中将'this'赋值给一个变量

12

我正在使用面向对象的Javascript编程方法,原因有两个。第一,它可以帮助我学习;第二,以防我的代码需要分发。

我已经将函数赋值给变量并使用this来声明公共变量。然而,我在使用this时遇到了问题。当我处于“私有”函数时,this指向不同的作用域,我无法访问this下的变量。以下是我的说明。

var ClassObject = function() {
  this.var1 = 'Hello';

  var var2 = 786;

  this.func1 = function() {
    alert(this.var1); // Alerts Hello
    alert(var2); // Alerts 786
  }

  var func2 = function() {
    alert(this.var1); // Alerts undefined
    alert(var2); // Alerts 786
  }
}

我找到的唯一一种让func2可以访问this.var1的方法是创建一个变量并将其赋值为thisvar c = this。这是完成此任务的最佳方式吗,甚至被广泛接受吗?有人能提供更好的解决方案吗?

谢谢大家。


6
简短回答:是的,这是完全可以接受的。我曾看到过变量 self 被用于此目的:var self = this; - Casey Chu
3个回答

10

是的,这是被广泛接受的做法。请参考这篇文章介绍作用域,或者这个问题

同时,阅读关于闭包的内容也可能会有所帮助。


你提供的链接非常有帮助。谢谢。 - Matt Mancuso
博客文章已被移至 https://www.jackfranklin.co.uk/blog/javascript-variable-scope-this/。 - Maduka Jayalath
另一个需要注意的是,箭头函数中的this与普通函数有所不同。请参阅以下解释:https://www.w3schools.com/js/js_arrow_function.asp - Maduka Jayalath

3
在每次函数调用时(包括调用私有函数),javascript解释器都会设置this的值。规则非常简单:
  1. 如果调用object.method(),那么this在方法内部设置为对象。
  2. 如果调用普通函数(无论是全局还是本地)如fn(),则this设置为全局对象(通常在浏览器中为window)。
  3. 当使用.apply().call()时,this设置为这些函数的第一个参数(例如,您可以通过传递给.apply().call()来控制它的设置)。
因此,当您调用私有函数时,您得到的是选项2。如果您想访问对象的this,您有以下三个选项:
  1. 将这些私有函数转换为方法(然后它们就不再是私有的了),并像this.func2()这样调用它们,以便javascript解释器为您设置this
  2. 使用.call().apply(),如func2.call(this),指示解释器按您所需设置this
  3. 在调用func1()之前将this的值存储在局部变量中,例如var self = this,以便您可以通过闭包在func1()内引用self。这在javascript中很常见(利用了闭包允许访问父作用域变量的方式)。

我还没有研究过.call().apply(),但我现在会了。谢谢。 - Matt Mancuso

0

除非您使用类似将其设置为另一个变量的内容,否则无法完成您想要的操作。因此,要么重新构建所有内容以避免这种情况,要么只需使用该变量即可。我认为使用变量是可以接受的。


好的,这真是快速和简单。非常感谢大家,@Casey 和 TMP,以及其他所有人。 - Matt Mancuso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接