这个“代码”在这个JavaScript代码中意味着什么?

时间:2009-07-13 10:19:53

标签: javascript scope this

<!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>

4 个答案:

答案 0 :(得分:14)

David Dorward已经提到过JavaScript:Douglas Crockford的好部分。

从那本优秀的书的第4.3节开始:

  

调用函数暂停   执行当前功能,   将控制和参数传递给   新功能。除了   声明参数,每个函数   接收另外两个参数:   这和争论。这个参数   在面向对象方面非常重要   编程,它的价值在于   由调用模式决定。   有四种调用模式   在JavaScript中:方法调用   模式,函数调用   模式,构造函数调用   模式和应用调用   图案。模式因人而异   这是奖金参数   初始化。

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

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

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

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

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

答案 1 :(得分:4)

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

JavaScript: The Good Parts中有一个很好的解释。

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

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

var foo = {
    bar: o.m;
}

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

答案 2 :(得分:1)

除了this之外还有

在范围链意义上,它将从底部函数中的this一直移回全局this

例如

p1:function(){
       //this
   }

然后就在它上面

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

然后它上方的this

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

雅虎的尼古拉斯·扎卡斯(Nicholas Zakas)在http://www.youtube.com/watch?v=mHtdZgou0qU

上发表了一篇精彩的演讲

答案 3 :(得分:0)

最好查看javascript闭包,了解范围和this指针赋值。 “这个”甚至在面向对象编程之前出现,但绝对是必不可少的。

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

  

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

     

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


  

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

     

事实是Activation对象及其参数   property和Variable对象,其命名属性对应   与函数局部变量,是相同的对象,允许   标识符参数被视为本地函数   变量

     

最后,为this关键字指定一个值。如果   value赋值是指一个对象,然后是属性访问器的前缀   使用该关键字引用该对象的属性。如果   value(internal)为null,则this关键字将引用   到全球对象。

     

全局执行上下文的处理稍有不同   它没有参数,所以它不需要定义的激活   反对他们的对象。全局执行上下文确实需要一个   范围及其范围链恰好由一个对象组成,即全局对象   宾语。全局执行上下文确实经历了变量   实例化,其内部函数是正常的顶级函数   构成大量javascript代码的声明。全球   object用作Variable对象,这就是全局声明的原因   函数成为全局对象的属性。和全球一样   声明变量。

     

全局执行上下文也使用对全局的引用   该对象的对象。   http://jibbering.com/faq/notes/closures/的致密性   章:标识符解析,执行上下文和范围链