首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问对象、上下文和作用域?

如何访问对象、上下文和作用域?
EN

Stack Overflow用户
提问于 2014-04-22 10:58:22
回答 2查看 86关注 0票数 0

我有这样的代码片段:

代码语言:javascript
复制
/** @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

我了解到

代码语言:javascript
复制
function say() { ... }

就是和

代码语言:javascript
复制
var say;
say = function() { ... }

它与

代码语言:javascript
复制
var say;
this.say = function() { ... }

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

-----EDIT-----

我仍然感到困惑,this是保存所有局部变量的对象吗?让我们再举几个例子。

代码语言:javascript
复制
// Tested both in node.js and Chrome 34
var t = "stackoverflow";
console.log(t); //=> stackoverflow
console.log(this.t); //=> stackoverflow

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

代码语言:javascript
复制
// 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

我说的对吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-22 11:07:31

你说这话的时候有个错误

代码语言:javascript
复制
var say;
say = function () { ... }

是相同的

代码语言:javascript
复制
var say;
this.say = function () { ... }

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

从这个意义上说,第二个代码块将为对象提供一个属性say,该属性恰好是一个函数。

当您在javascript中使用构造函数时,对象将公开的惟一内容是使用this关键字给它的那些东西。另一方面,内部函数是在构造函数范围内的函数,可以在构造函数中使用,但不公开,因为您不想这样做。

将其与此函数进行比较,该函数恰好构建了一个对象文本:

代码语言:javascript
复制
function buildMyObject() {

    function doSomething (obj) { ... }

    var objToBuild = { };

    doSomething(objToBuild);

    return objToBuild;
}

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

编辑:-- this关键字可以简要描述如下:当您在函数中使用它时,this保存对函数所属对象的引用。换句话说,this函数保存对当前实例的引用,即包含该函数的实例。

现在你的第一个例子

代码语言:javascript
复制
// Tested both in node.js and Chrome 34
this.t = "stackoverflow";
console.log(t); //=> stackoverflow
console.log(this.t); //=> stackoverflow

为什么会发生这种事?因为在这种情况下,函数所属的对象就是window。在这种情况下,tthis.t都是相同的,因为this持有对window对象的引用。

虽然您在使用this时必须知道作用域,因为它与作用域有关,但这个关键字只保存对拥有使用它的函数的对象的引用。

票数 2
EN

Stack Overflow用户

发布于 2014-04-22 11:04:01

this.sayPerson.say分配对象的属性。内部函数是函数作用域中的局部变量,而不是对象的属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23217542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档