如何访问对象的上下文和范围?

我有这样的代码片段:

/** @constructor */
Person = function() {
    // member method
    this.say = function() {
        return "I'm an instance.";
    }

    // inner function
    function say() {
        return "I'm inner.";
    }
}
// static method
Person.say = function() {
    return "I'm static.";
}

var p = new Person();
p.say();      //=> I'm an instance.
Person.say(); //=> I'm static.
// there is no way to directly access the inner function from here

我知道了

function say() { ... }

等同于

var say;
say = function() { ... }

等同于

var say;
this.say = function() { ... }

那么,为什么内部函数没有覆盖成员方法呢?

-----编辑-----
我仍然感到困惑,是this保存所有局部变量的对象吗?让我们在这里再举一些例子。

// Tested both in node.js and Chrome 34
var t = "stackoverflow";
console.log(t); //=> stackoverflow
console.log(this.t); //=> stackoverflow

因此,这意味着,当我声明局部变量时,可以通过this关键字访问它

// Tested both in node.js and Chrome 34
this.t = "stackoverflow";
console.log(t); //=> stackoverflow
console.log(this.t); //=> stackoverflow

这意味着,当我向分配属性时this,可以通过本地范围访问它。这很混乱!就像wrappers函数有两个一样,一个是上下文this,另一个是作用域吗?
因此,现在我对这种机制的理解是:

  • 假设我在作用域中声明了一个变量,让我们命名它tmp然后,如果我通过访问它this,JSVM将首先查找this以查看是否this.tmp存在。如果没有,它将寻找tmp如果没有找到,我得到undefined
  • 我在中声明了一个变量this,让我们命名它this.tmp然后,如果我通过简单的编写来访问它tmp,那么JSVM将首先查找范围以查看是否tmp存在。如果没有,它将查看是否this.tmp存在。如果没有找到,我得到undefined

我对吗?

用户名

你说错了

var say;
say = function () { ... }

等同于

var say;
this.say = function () { ... }

并了解您为什么需要了解this关键字。此关键字保存对使用它的函数所属的对象的引用。在构造函数内部时,您要引用正在构造的对象,因此可以使用this在这种情况下,当您将某些内容放入this构造函数将生成的对象中时。

从这种意义上讲,第二段代码将为您提供一个具有一个say恰好是函数的属性的对象

当您在javascript中使用构造函数时,该对象唯一公开的内容是使用this关键字赋予该对象的属性另一方面,内部函数是在构造函数范围内的函数,可以在其中使用,但由于您不希望在内部构造函数中不公开,因此内部函数不公开。

将其与生成对象文字的以下函数进行比较:

function buildMyObject() {

    function doSomething (obj) { ... }

    var objToBuild = { };

    doSomething(objToBuild);

    return objToBuild;
}

在这种情况下,为方便起见,您可以定义一个函数来对对象执行某些操作,然后在构建对象的函数内部使用它。返回了该对象,但是看到完成该功能的函数被隐藏了,因为它只是在的范围之内buildMyObject这类似于您在构造函数中使用函数的情况:它们提供在构造函数内部可能有用的实用程序,但是由于作用域,它们在外部世界中是隐藏的。

编辑:this关键字可以是简要地描述如下:当您使用它在函数内部,this保持向函数所属的对象的引用。换句话说,该this功能持有对当前实例的引用,即持有该功能的那个实例。

现在你的第一个例子

// Tested both in node.js and Chrome 34
this.t = "stackoverflow";
console.log(t); //=> stackoverflow
console.log(this.t); //=> stackoverflow

为什么会这样?好吧,因为在这种情况下,该函数所属的对象就是simple window在这种情况下,tthis.t都是相同的,因为它们this持有对window对象的引用

尽管在使用时必须注意作用域,this因为它取决于作用域,但是此关键字只是将对拥有该功能的对象的引用保留为该引用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

执行上下文和((此对象))

来自分类Dev

如何访问正确的数据上下文

来自分类Dev

函数如何访问类的上下文

来自分类Dev

如何创建可在应用程序范围内访问的上下文对象以在数据访问中存储当前用户详细信息?

来自分类Dev

文字对象函数范围,如何将函数和上下文传递给第三个对象

来自分类Dev

Scala上下文范围

来自分类Dev

如何在没有上下文的情况下访问“克隆站点对象”?

来自分类Dev

使用Storm时,如何从拓扑上下文访问对象?

来自分类Dev

如何访问在Java中的.class对象而不使用类名从静态上下文

来自分类Dev

使用Storm时,如何从拓扑上下文访问对象?

来自分类Dev

Javascript:如何根据上下文对象的旋转来移动上下文对象

来自分类Dev

Durandal小部件内部功能的范围和上下文

来自分类Dev

可变范围和javascript执行上下文

来自分类Dev

可变范围和javascript执行上下文

来自分类Dev

访问其他文件中的Lambda上下文对象

来自分类Dev

从原型函数JavaScript访问对象上下文

来自分类Dev

Javascript中的执行上下文和执行上下文对象

来自分类Dev

如何在以@RunWith和@ContextConfiguration注释的jUnit测试中访问Spring上下文?

来自分类Dev

如何更改对javascript属性的调用的范围/上下文?

来自分类Dev

用promise和'this'上下文调用对象方法

来自分类Dev

如何从子上下文访问类属性

来自分类Dev

如何在Meteor中访问选项的上下文?

来自分类Dev

如何在React中访问画布上下文

来自分类Dev

如何使用Spark上下文访问Web URL

来自分类Dev

如何在静态上下文中访问文件?

来自分类Dev

如何访问Sprite 2D上下文?

来自分类Dev

如何从特征的上下文访问案例类的参数

来自分类Dev

如何从插件内部访问查询中给定的上下文?

来自分类Dev

如何从子上下文访问类属性

Related 相关文章

  1. 1

    执行上下文和((此对象))

  2. 2

    如何访问正确的数据上下文

  3. 3

    函数如何访问类的上下文

  4. 4

    如何创建可在应用程序范围内访问的上下文对象以在数据访问中存储当前用户详细信息?

  5. 5

    文字对象函数范围,如何将函数和上下文传递给第三个对象

  6. 6

    Scala上下文范围

  7. 7

    如何在没有上下文的情况下访问“克隆站点对象”?

  8. 8

    使用Storm时,如何从拓扑上下文访问对象?

  9. 9

    如何访问在Java中的.class对象而不使用类名从静态上下文

  10. 10

    使用Storm时,如何从拓扑上下文访问对象?

  11. 11

    Javascript:如何根据上下文对象的旋转来移动上下文对象

  12. 12

    Durandal小部件内部功能的范围和上下文

  13. 13

    可变范围和javascript执行上下文

  14. 14

    可变范围和javascript执行上下文

  15. 15

    访问其他文件中的Lambda上下文对象

  16. 16

    从原型函数JavaScript访问对象上下文

  17. 17

    Javascript中的执行上下文和执行上下文对象

  18. 18

    如何在以@RunWith和@ContextConfiguration注释的jUnit测试中访问Spring上下文?

  19. 19

    如何更改对javascript属性的调用的范围/上下文?

  20. 20

    用promise和'this'上下文调用对象方法

  21. 21

    如何从子上下文访问类属性

  22. 22

    如何在Meteor中访问选项的上下文?

  23. 23

    如何在React中访问画布上下文

  24. 24

    如何使用Spark上下文访问Web URL

  25. 25

    如何在静态上下文中访问文件?

  26. 26

    如何访问Sprite 2D上下文?

  27. 27

    如何从特征的上下文访问案例类的参数

  28. 28

    如何从插件内部访问查询中给定的上下文?

  29. 29

    如何从子上下文访问类属性

热门标签

归档