JavaScript 中私有变量和实例变量的方法和变量作用域

2024-01-21

我试图弄清楚这一点或在谷歌上搜索它,我只能找到如何创建对象,而不是函数到底是如何工作的。如果有人可以向我解释封装是如何工作的。

function myObject() {

    this.variable1 = "tst";

    this.function1 = function() {
        //Now this function works.  A 'this' function to a private function is ok
        _PrivateFunction1();

        //Here is error one, I cannot seem to call methods within the object
        //from.  
        this.function2();
    }

    this.function2 = function() {
        alert("look! function2!");
    }

    function _PrivateFunction1() {
        //This does work though.  I am confused.
        _PrivateFunction2();
    }

    function _PrivateFunction2() {
        alert("look! PrivateFunction1");

        //this does not work.
        alert(this.variable1);
    }
}

我想如果我们以相反的顺序来解释的话我可以更好地解释这一点。首先,我们定义一些函数:

function _PrivateFunction1() {
    //This does work though.  I am confused.
    _PrivateFunction2();
}

function _PrivateFunction2() {
    alert("look! PrivateFunction1");

    //this does not work.
    alert(this.variable1);
}

这是很正常的事情。唯一奇怪的是它们出现在另一个函数中,但这完全没问题。 JavaScript 有功能范围 https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope#Nested_functions_and_closures,这意味着函数内定义的所有变量都在新作用域中定义。他们不践踏全局命名空间。功能是一流的物体 http://en.wikipedia.org/wiki/First-class_object在 JavaScript 中,这意味着它们可以像其他数据类型一样使用。它们可以嵌套、传递给函数、从函数返回等。

然后我们遇到了一些麻烦:

    function _PrivateFunction2() {
        alert("look! PrivateFunction1");

        //this does not work.
        alert(this.variable1);
    }
}

JavaScript 中的函数总是执行于某些context https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/this这是由this关键词。当您直接调用函数时(即像这样:functionName())该函数执行的上下文是全局的window目的。所以,里面_PrivateFunction2, this.variable1相当于window.variable1这可能不是你的意思。

您可能想引用当前实例myobject这是什么this指的是外面_PrivateFunction2。您可以保留对this通过将对它的引用存储在另一个变量中来在内部作用域中:

var _this = this;

function _PrivateFunction2() {
    alert("look! PrivateFunction1");

    //this does not work.
    alert(_this.variable1);
}

这里有一些微妙的东西你应该注意到。_PrivateFunction2可以访问其定义的变量词汇范围 https://stackoverflow.com/questions/1047454/what-is-lexical-scope,这就是为什么它可以访问_this。这在以后很重要。

Next up:

    function _PrivateFunction1() {
        //This does work though.  I am confused.
        _PrivateFunction2();
    }

我想这对你来说应该是最正常的部分。这里没有什么奇怪的事情发生。只是一个常规函数调用另一个函数。不要对它们嵌套在内部的事实感到困惑myObject。这改变了它们所处的范围,但没有什么其他改变。

接下来我们定义一些实例变量和方法:

this.variable1 = "tst";

this.function1 = function() {
    //Now this function works.  A 'this' function to a private function is ok
    _PrivateFunction1();

    //Here is error one, I cannot seem to call methods within the object
    //from.  
    this.function2();
}

this.function2 = function() {
    alert("look! function2!");
}

Here this确实指的是myObject,假设——这是一个重要的假设——myObject被称为与new运算符,如下所示:

var obj = new myObject();

如果它是这样调用的:

var obj = myObject();

Then this会指的是window对象,就像我们之前看到的函数一样。关键要点是this不是固定的。它由函数的调用方式决定。甚至有办法将其设置为任意对象 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply明确地。

的价值this inside this.function1也将是当前实例myObject,因为它很可能会这样使用:

var obj = new myObject();
obj.function1();

Writing object.method() sets this to object inside method.

那么怎么样this.function1能够打电话_PrivateFunction1()?正如我们之前在保存值时看到的那样this用于嵌套函数内部,_PrivateFunction1()只是定义在中的另一个对象this.function1的词法范围,因此它可供其使用,就像_this是更早的。

这是因为关闭 http://jibbering.com/faq/notes/closures/这些私有变量在很久之后仍然存在myObject已经回来了。

脚注:因为未能使用new实例化对象时毫无预兆地破坏事物 https://stackoverflow.com/questions/383402/is-javascript-s-new-keyword-considered-harmful,将要用作构造函数的函数名称大写被认为是一个好习惯。所以myObject确实应该是MyObject.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 中私有变量和实例变量的方法和变量作用域 的相关文章

随机推荐

  • GDI泄漏问题

    我注意到使用任务管理器 以下代码中存在 GDI 泄漏 每次执行此代码时 执行此代码的进程中 GDI 对象的计数都会增加 1 但我似乎找不到问题 任何帮助 将不胜感激 create new DC based on current HDC hD
  • 如何让网页高度适合屏幕高度

    我需要使我的网页高度适合屏幕尺寸的高度而不滚动 HTML
  • 使用 R ggplot2 和 ggplotly 在地图上一年的累积点

    我正在尝试在地图上累计绘制每个月打开的新位置 我可以每月创建一个包含新位置的动画 但不能累积 换句话说 我希望看到新地点添加到现有地点 这是示例数据 DF lt data frame latitude c 42 29813 41 83280
  • 从 WooCommerce 购物车错误消息中删除库存数量

    在 WooCommerce 中 我将 woocommerce gt settings gt products gt inventory gt stock display format 设置为 永远不要显示剩余库存数量 但是 如果客户将产品广
  • 将 Numpy 数组保存为图像(说明)

    我在之前的帖子中找到了答案 将 Numpy 数组保存为图像 https stackoverflow com questions 902761 saving a numpy array as an image 唯一的问题是 没有太多关于使用
  • 在 Python/Bash 中通过 SSH/Sudo 测试文件/目录是否存在 [重复]

    这个问题在这里已经有答案了 我正在远程服务器上安装证书 并想在覆盖它们之前检查它们是否存在 服务器仅允许通过 ssh 公钥进行非 root 访问 我可以sudo s在 shell 中 root 一次 需要 root 权限 因为其他人无法读取
  • Play 框架模板自动导入模型。_ 除其他外

    似乎在 Play 框架模板中 有一个隐式的 import models 和 import play api data Form 因为我的代码 title String myForm Form User 无需在第一行后放置显式导入语句即可工作
  • ASP运行在64位环境下,使用Access数据库

    我有一位客户自 2003 年以来一直在运行一个使用 asp 3 0 构建的简单网站 其中包含一个 access 数据库文件 mdb 最近 该客户购买了一台带有 Windows 2003 Server 64 位的新服务器 该网站不再运行 显示
  • WMI 调用获取驱动程序

    我是 WMI 的新手 它是什么 例如 我可以在 C 中使用 WMI 调用来获取我的 PC 上的驱动程序列表吗 如果是这样 我该打电话给哪个班级 要列出已安装的驱动程序 您可以使用Win32 PnPSignedDriver http msdn
  • Python 中的球形 k 均值实现

    我一直在使用scipy 的 k 均值 http docs scipy org doc scipy reference cluster vq html已经有一段时间了 我对它在可用性和效率方面的工作方式感到非常满意 然而 现在我想探索不同的
  • C# 5.0 异步中的可等待和等待者

    Task 或Task 对象是可等待的 因此我们可以对返回值为Task 或Task 的对象使用await 键 Task 或 Task 是最常用的可等待对象 我们还可以定义自己的可等待对象 该对象应该具有以下资格 它有一个 GetAwaiter
  • 绑定字符串格式

    我有一组要显示的文本块 并且我需要每个文本块的文本以不同的方式显示 我当前正在标记属性中保存格式字符串 并且需要以此格式显示文本 如何绑定 StringFormat 部分 类似于下面的部分
  • Web容器无法从docker compose调用后端容器

    我仍在码头工人的世界中找到自己的立足点 我正在尝试将我的小宠物项目 Docker 化 前端是一个 vue cli 应用程序 它与包含 spring boot 制作的 Restful API 的后端进行通信 所以我的方法是为后端和前端声明两个
  • 视图控制器未收到 -shouldAutorotateToInterfaceOrientation:第二次加载时的消息?

    我有一个UIViewController我用它来控制 弹出 视图 以便在整个应用程序中查看图像 它支持自动旋转 因为无论方向如何 它都会自动调整图像大小以正确适合 这工作得很好 但只是在我第一次初始化并显示视图控制器时 当它关闭时 我将删除
  • HTML5 音频/视频停止缓冲区

    有没有办法停止浏览器中的缓冲 我有一个指向某个 mp3 文件的音频标签 浏览器在播放音频时开始缓冲音频 我可以停止缓冲吗 我知道理想情况下 如果您的音频数据输入速度比客户端可以播放的速度更快 为什么不缓冲它 我要求的是音频播放器应该只缓冲最
  • 在 Unity 编辑器中显示数组成员的某些属性,具体取决于这些数组成员的其他属性

    我有课MyClass它具有枚举和属性 根据枚举 我想在编辑器中显示某些属性 有这样的枚举 first Second 和属性 health step position 如果选择第一个 则在编辑器中显示名称和步骤 如果选择第二个 则显示步骤和位
  • 在一个函数中生成幂集,没有显式递归,并且在 Racket 中仅使用最简单的原语

    Note 这是对家庭作业的奖励 但我花了太长时间尝试却毫无结果 非常感谢帮助 但我认为没有必要 Premise 为数字列表生成幂集 但不使用任何辅助函数 显式递归 循环或除cons first rest empty empty else l
  • WCF IIS 托管服务由单个服务实现的多个服务合同 - 如何通过配置在端点之间共享 uri

    我有一组服务合同 它将我的服务接口分成相关功能块 我目前正在使用单个服务类实现所有合约 稍后可能需要拆分这些合约 但目前单个服务类就足够了 我正在尝试使用配置文件 而不是通过代码 配置端点 问题是我得到了ServiceActivationE
  • 统一圆形LBP人脸识别实现

    我正在尝试使用均匀圆形 LBP 1 单位半径邻域中的 8 个点 来实现基本的人脸识别系统 我正在拍摄图像 将其大小调整为 200 x 200像素然后将图像分割为 8x8 小图像 然后我计算每个小图像的直方图并获取直方图列表 To 比较 2
  • JavaScript 中私有变量和实例变量的方法和变量作用域

    我试图弄清楚这一点或在谷歌上搜索它 我只能找到如何创建对象 而不是函数到底是如何工作的 如果有人可以向我解释封装是如何工作的 function myObject this variable1 tst this function1 funct