【问题标题】:What do these "this" mean in this JavaScript code?在这段 JavaScript 代码中,这些“this”是什么意思?
【发布时间】:2009-07-13 10:19:53
【问题描述】:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <title>test</title>

    </head>
    <body>
        <script type="text/javascript" charset="utf-8">
            (function(){
                // this
                var test=function(){
                    //this
                    return function(){
                        //this
                    };
                }

                (function(){
                    //this
                    var a={
                        p1:function(){
                            //this
                        }
                    };
                })();
            })();
        </script>       
    </body>
</html>

【问题讨论】:

  • 请注意,包含的 Javascript 可能没有宣传的那么简单。条款和条件适用。优惠在加拿大无效。
  • 只是复制粘贴一些代码并不是一个好问题。 -1

标签: javascript scope this


【解决方案1】:

David Dorward 已经提到了 Douglas Crockford 的 JavaScript:The Good Parts。

来自那本优秀书籍的第 4.3 节:

调用函数会挂起 执行当前函数, 将控制和参数传递给 新功能。除了 声明的参数,每个函数 接收两个附加参数: 这和论点。这个参数 在面向对象中非常重要 编程,其值为 由调用模式决定。 有四种调用模式 在 JavaScript 中:方法调用 模式,函数调用 模式,构造函数调用 模式和应用调用 图案。模式的不同之处在于 奖金参数这是 初始化。

Crockford 继续解释每种模式中“this”的绑定,如下所示:

方法调用模式:当函数作为对象的属性存储时,我们称其为方法。当调用一个方法时,this 会绑定到该对象。

函数调用模式:当使用此模式调用函数时, this 绑定到全局对象。这是语言设计中的一个错误。

构造函数调用模式:如果使用 new 前缀调用函数,则将创建一个新对象,其中包含指向函数原型成员值的隐藏链接,并且 this 将被绑定到那个新对象。

Apply 调用模式: apply 方法让我们可以构造一个参数数组来调用一个函数。它还允许我们选择 this 的值。 apply 方法有两个参数。第一个是应该绑定到 this 的值。第二个是参数数组。

【讨论】:

  • 对“调用”调用模式(fn.call(context,arg1,arg2,...argn))一无所知?
  • @gion_13,就this而言,它相当于“应用调用模式”,see a related answer
【解决方案2】:

this 的含义取决于包含它的函数是如何调用,而不是它是如何构造

JavaScript: The Good Parts 中对它的工作原理进行了很好的解释。

简短的版本是,当您将函数 (m) 作为对象 (o) 的方法调用时,this 就是 o

var o = {
   m: function () {
      return this;
   }
}

var foo = {
    bar: o.m;
}

o === o.m();
foo === foo.bar();

【讨论】:

    【解决方案3】:

    this 除外

    在作用域链意义上,它将从底部函数中的this 一直移动到全局this

    例如

    中的this
    p1:function(){
           //this
       }
    

    然后是上面的这个

    (function(){
      //this
      var a={
       p1:function()
    

    然后是上面的this

     (function(){
        // this
        var test=function(){
    

    Nicholas Zakas 在 Yahoo 上有一个很好的介绍,地址是 http://www.youtube.com/watch?v=mHtdZgou0qU

    【讨论】:

      【解决方案4】:

      最好查看 javascript 闭包,以了解作用域和 this 指针分配。 “this”甚至在面向对象编程之前就出现了,但对于它来说绝对是必不可少的。

      http://jibbering.com/faq/notes/closures/

      这在很大程度上取决于作用域链在标识符中的作用 解析等对象属性名称的解析。

      对闭包的简单解释是 ECMAScript 允许内部 职能;函数定义和函数表达式 在其他函数的函数体中。


      在变量对象上创建的属性对应于 声明的局部变量最初被赋予未定义的值 在变量实例化期间,本地的实际初始化 变量不会发生,直到相应的评估 函数体代码执行期间的赋值表达式。

      事实上,Activation 对象及其参数 属性和变量对象,与命名属性对应 与函数局部变量,是同一个对象,它允许 标识符参数被视为一个函数本地 变量。

      最后为 this 关键字分配了一个值。如果 分配的值是指一个对象,然后是属性访问器前缀 使用该对象的 this 关键字引用属性。如果 分配的值(内部)为 null 然后 this 关键字将引用 到全局对象。

      全局执行上下文的处理方式略有不同 它没有参数,因此不需要定义的激活 反对引用他们。全局执行上下文确实需要一个 范围及其范围链仅由一个对象组成,即全局 目的。全局执行上下文确实通过变量 实例化,它的内部函数是普通的顶级函数 构成大部分 javascript 代码的声明。全球 对象被用作变量对象,这就是为什么全局声明 函数成为全局对象的属性。和全球一样 声明的变量。

      全局执行上下文也使用对全局的引用 此对象的对象。 礼貌http://jibbering.com/faq/notes/closures/ 章节:标识符解析、执行上下文和作用域链

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-28
        • 1970-01-01
        相关资源
        最近更新 更多