代码之家  ›  专栏  ›  技术社区  ›  Thomas L Holaday

这个javascript习语的基础是什么:var self=this?

  •  337
  • Thomas L Holaday  · 技术社区  · 15 年前

    我在源代码中看到了以下内容 WebKit HTML 5 SQL Storage Notes Demo :

    function Note() {
      var self = this;
    
      var note = document.createElement('div');
      note.className = 'note';
      note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false);
      note.addEventListener('click', function() { return self.onNoteClick() }, false);
      this.note = note;
      // ...
    }
    

    作者使用 自己 在某些地方(功能体)和 在其他地方(方法参数列表中定义的函数体)。发生什么事?既然我注意到了一次,我会到处看到它吗?

    10 回复  |  直到 6 年前
        1
  •  414
  •   Stacked Emily M    8 年前

    看到这个 article on alistapart.com

    self 用于维护对原始文件的引用 this 即使环境在变化。这是一种常用于事件处理程序(尤其是闭包)的技术。

        2
  •  96
  •   Étienne Hampden123    8 年前

    我认为变量名'self'不应该再这样使用了,因为现代浏览器提供了 global variable self 指向普通窗口或WebWorker的全局对象。

    为了避免混淆和潜在的冲突,你可以写 var thiz = this var that = this 相反。

        3
  •  34
  •   Stacked Emily M    8 年前

    是的,到处都能看到。它经常 that = this; .

    看看如何 self 是否在由事件调用的函数内使用?他们有自己的背景,所以 自己 用于保持 this 进来的 Note() .

    原因 自己 函数仍然可用,即使它们只能在 () 函数已完成执行,是因为内部函数获取外部函数的上下文 关闭 .

        4
  •  28
  •   Max    13 年前

    还应注意,有一种替代代理模式,用于维护对原始代理的引用。 this 如果你不喜欢 var self = this 成语。

    作为函数,可以通过使用 function.apply function.call ,可以编写一个包装器,该包装器返回用 apply call 使用给定的上下文。参见jQuery proxy 用于实现此模式的函数。下面是使用它的示例:

    var wrappedFunc = $.proxy(this.myFunc, this);

    wrappedFunc 然后可以调用并将具有您的版本 作为上下文。

        5
  •  9
  •   Mehrdad Afshari    15 年前

    该变量由方法中定义的内联函数捕获。 this 在函数中将引用另一个对象。这样,可以使函数保持对 在外部范围内。

        6
  •  9
  •   kombat    10 年前

    这是一个javascript怪癖。当函数是对象的属性时,更恰当地称为方法, 指的是对象。在事件处理程序的示例中,包含对象是触发事件的元素。当调用标准函数时, 将引用全局对象。当您像示例中那样具有嵌套函数时, 根本与外部函数的上下文无关。内部函数与包含函数共享范围,因此开发人员将使用 var that = this 为了保存 他们需要内在的功能。

        7
  •  6
  •   Elliot B.    7 年前

    正如其他人所解释的, var self = this; 允许在 closure 返回到父作用域。

    然而,现在是2018年,所有主要的网络浏览器都广泛支持ES6。这个 var self=这个; 成语不像以前那么重要。

    现在可以避免 var self=这个; 通过使用 arrow functions .

    在我们会使用的情况下 var self = this :

    function test() {
        var self = this;
        this.hello = "world";
        document.getElementById("test_btn").addEventListener("click", function() {
            console.log(self.hello); // logs "world"
        });
    };
    

    我们现在可以使用箭头函数 VaR自我= :

    function test() {
        this.hello = "world";
        document.getElementById("test_btn").addEventListener("click", () => {
            console.log(this.hello); // logs "world"
        });
    };
    

    箭头函数没有自己的函数 this 并简单地假设封闭范围。

        8
  •  5
  •   miphe    10 年前

    实际上,self是对window的引用( window.self )所以当你说 var self = 'something' 您重写对自身的窗口引用-因为自身存在于窗口对象中。

    这就是大多数开发人员喜欢的原因 var that = this 结束 var self = this;

    无论如何; var that = this; 不符合良好实践…假设您的代码稍后会被其他开发人员修改/修改,那么您应该在开发人员社区中使用最常见的编程标准。

    因此,您应该使用var之类的东西 oldThis / var oThis /等等——在你的范围内清楚地说,/…不算多,但会节省几秒钟和几次大脑循环。

        9
  •  0
  •   Cyprien    10 年前

    如前几次提到的,“self”只是用来在进入功能之前保持对“this”的引用。一旦在函数中,“this”指的是其他东西。

        10
  •  -1
  •   ht zhao    6 年前
    function Person(firstname, lastname) {
      this.firstname = firstname;
    
      this.lastname = lastname;
      this.getfullname = function () {
        return `${this.firstname}   ${this.lastname}`;
      };
    
      let that = this;
      this.sayHi = function() {
        console.log(`i am this , ${this.firstname}`);
        console.log(`i am that , ${that.firstname}`);
      };
    }
    
    let thisss = new Person('thatbetty', 'thatzhao');
    
    let thatt = {firstname: 'thisbetty', lastname: 'thiszhao'};
    

    这是Sayhi.Call(thatt);