如何设置 var self = this;从函数外部

How to set var self = this; from outside the function?

本文关键字:this 外部 函数 self var 何设置 设置      更新时间:2023-09-26

我有一个类似类的函数

var myapp = function() {
    this.method = function() {
        //Do something...
    }
}

若要从方法内部引用myappmyapp函数中的第一行是

var self = this;

因此,myapp中的方法可以安全地引用"类"

this.anothermethod = function() {
    self.method();
}

完整代码:

var myapp = function() {
    var self = this;
    this.dosomething = function(Callback) {
        Callback();
    }
    this.anothermethod = function() {
        //Pass a callback ("self" is required here)...
        this.dosomething(function() { 
            self.complete(); 
        )};
    }
    this.complete = function() {
        console.log('All done!');
    }
}

我的问题是:我可以从myapp声明之外分配var self = this;吗?我不想每次写"类"时都设置self

有点像这样:

var library = function() {
    this.loadclass = function(Name) {
        var tempclass = window[Name];
        library[Name] = new tempclass();
        library[Name].self = library[Name];
    }
}
var myapp = new library();
myapp.loadclass('myapp');
myapp.myapp.dosomething();

它无法按预期工作。 出于某种原因,self等于window

我知道这有点不正常的编程,但能做到吗?


关于使用self的注意事项:我记得我为什么开始使用它。我想从方法内部的回调中引用基类(this)。一旦您尝试在方法的函数中使用this,它就会引用该方法,而不是基类。

除非将方法与对象分离并将它们作为普通函数调用,否则根本不需要self变量。该方法可以使用 this 关键字访问其对象:

var myapp = function() {
  this.method = function() {
    //Do something...
  }
  this.anothermethod = function() {
    this.method();
  }
}

不,你真的不能;至少不是你创建对象的方式。

您可以通过枚举对象上的所有函数并将它们绑定到对象本身来执行此操作。像这样:

Object.keys(obj)
  .filter(function(n) { return typeof obj[n] == "function" })
  .forEach(function(n) { obj[n] = obj[n].bind(obj) })

这个函数将检查obj的公共、可枚举的属性,并确保它上面的任何函数都绑定到obj;即 this现在注定要obj.


this入门

调用 new 时,构造函数中的this将绑定到新创建的对象。如果确实需要对this的引用,因为它在构造函数时被绑定,则确实需要保留对它的引用。

JavaScript 中的函数绑定到调用它的任何位置。下面是一个示例:

var foo = new function() {
  this.bar = function() {
    return 'bar'
  }
  this.baz = function() {
    return this.bar()
  }
}
console.log(foo.bar()) // bar
console.log(foo.baz()) // bar
var bar = function() {
  return "window"
}
var baz = foo.baz
console.log(baz()) // window

当我们调用foo.baz()时,它会寻找foo来实现bar,但是当通过"分离"引用调用foo.baz时,它会查找全局对象是什么(在本例中为浏览器窗口对象)并从那里调用bar。因为我们在全局上下文中定义了bar,所以它随后返回window

赋值一个名为 self 的变量的做法是,如何调用方法并不重要,因为您始终在创建时通过 self 变量引用this。你不必这样写东西,但你应该明白,对this的引用可能会在你的脚下改变。