gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:52:24 25 4
gpt4 key购买 nike

我有一个这样的代码片段:

/** @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 时,我可以通过本地范围访问它。这很令人困惑!那么是不是就像函数有两个包装一样,一个是上下文this,另一个是作用域?
所以现在我对这个机制的理解是:

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

我说得对吗?

最佳答案

你这么说就错了

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

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

并了解为什么您需要了解 this 关键字。该关键字保存对使用它的函数所属对象的引用。当在构造函数内时,您想要引用正在构造的对象,因此您使用 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

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

虽然在使用 this 时必须注意作用域,因为它依赖于作用域,但 this 关键字只是保存对拥有使用它的函数的对象的引用。

关于javascript - 如何访问对象上下文和范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23217542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com