javascript – 当我将它设置为等于全局变量时,变量指向何处?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 当我将它设置为等于全局变量时,变量指向何处?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5321字,纯文字阅读大概需要8分钟。
内容图文
这是一个简单的例子:
1| window.gamelogic = {};
2| var g = gamelogic;
3| g.points = 1;
4| g.array = ["foo","bar"];
5| var b = g.points;
6| b = b + 1;
7| console.log(window.gamelogic);
8| console.log(b);
这将打印:
Object { points=1, array=[2] }
2
所以这里有两件事需要注意:
>一个(看似本地的)变量 – g – 当设置为全局对象并更新时,还会更新golbal对象 – window.gamelogic. (更新g也更新了window.gamelogic).
>本地int,b(设置为全局int,points)在更改时不会更新全局变量. (更新b没有更新window.gamelogic.points)
基于第一点,可以认为当var指向全局对象时,实际上只是创建指向该全局对象的相同内存位置的另一个指针.这可以解释为什么更新g也会更新window.gamelogic.
但是,b不更新window.gamelogic.points似乎反驳了这一论点.
这里发生了什么?
解决方法:
在JavaScript中,变量(和属性)包含值.值可以有许多不同的类型(数字,字符串,布尔值),其中一个是对象引用,它是对象的引用,但不是实际的对象本身.想一个对象引用的简单方法是它只是一个数字,就像一个真正大的数组的索引,告诉我们对象的位置. (这不是真的,但它是一种有用的思考方式.)或者在非编程术语中,乔可能会有一张纸上写着“123 Any St.”写在上面,这是乔的家.这篇论文是变量(或属性); “123 Any St.”是一个值(在这种情况下是一个对象引用),而house是一个对象.
对象不是值,因此它们不能存储在变量或属性中(或作为函数参数传递).只能引用它们.
将值赋给变量或属性(或将其作为参数传递给函数)时,您将从源中将值复制到其中.所以a = b将b中的值复制到a中.当b包含一个对象引用时,它是被复制的引用,而不是对象;然后a和b都引用同一个对象.这就像玛丽拿出一张纸(a)并抄下Joe的纸上的东西(b).现在两张纸都说乔的房子在哪里.房子没有被复制,只是信息告诉我们它在哪里.
考虑到这一点,让我们看看你的代码.当你这样做
window.gamelogic = {};
它创建一个对象并将其引用(值)复制到属性gamelogic中.这是一个粗略的草图,记录了那时内存中的内容,省略了许多不必要的细节:
+-------------------+ | (stuff omitted) | +-----------+ window:ref429--->| gamelogic: ref758 |------>| | +-------------------+ +-----------+
然后你这样做:
var g = gamelogic;
哪个(挥手)创建一个变量(我将解释稍后挥动的手)并将gamelogic中的值分配(复制)给它.由于该值是对象引用,g和gamelogic现在指向相同的位置;也就是说,它们指的是同一个对象:
+-------------------+ | (stuff omitted) | window:ref429--->| gamelogic: ref758 |---+ +-------------------+ | +-----------+ +-->| | | +-----------+ g: ref758--------------------------------+
然后你做
g.points = 1;
在该对象上创建一个名为points的属性,并将值1复制到其中:
+-------------------+ | (stuff omitted) | window:ref429--->| gamelogic: ref758 |---+ +-------------------+ | +-----------+ +-->| points: 1 | | +-----------+ g: ref758--------------------------------+
让我们重点介绍一下我们在这里所做的事情:我们没有以任何方式更改g中的值,它仍然与它相同:对gamelogic也引用的对象的引用.我们所做的是改变了该对象的状态(通过向其添加属性).这是关于对象的关键事项之一:它们具有可以改变的状态.当这个状态发生变化时,你看它时对它的引用副本无关紧要;无论如何,你都会看到相同的对象及其(更新的)状态.
好的,继续:
g.array = ["foo","bar"];
它创建一个数组(它是一个对象),并在我们的对象上创建一个名为array的属性,并将该数组引用的值复制到该属性中:
+-------------------+ | (stuff omitted) | window:ref429--->| gamelogic: ref758 |---+ +-------------------+ | +---------------+ +----------+ +-->| points: 1 | | 0: "foo" | | | array: ref804 |---->| 1: "bar" | g: ref758--------------------------------+ +---------------+ +----------+
然后你做:
var b = g.points;
其中(wave hands)创建一个变量并将g.points(1)中的值复制到其中:
+-------------------+ | (stuff omitted) | window:ref429--->| gamelogic: ref758 |---+ +-------------------+ | +---------------+ +----------+ +-->| points: 1 | | 0: "foo" | | | array: ref804 |---->| 1: "bar" | g: ref758--------------------------------+ +---------------+ +----------+ b: 1
然后
b = b + 1;
从b获取值1,向其中加1,并将新值(2)存储在b中. g.points完全不受影响:
+-------------------+ | (stuff omitted) | window:ref429--->| gamelogic: ref758 |---+ +-------------------+ | +---------------+ +----------+ +-->| points: 1 | | 0: "foo" | | | array: ref804 |---->| 1: "bar" | g: ref758--------------------------------+ +---------------+ +----------+ b: 2
以上要点是:
>变量和属性(和函数参数)包含值.
>值具有类型,例如字符串,数字,布尔值或对象引用.
>对象引用只是一个表示对象所在位置的值.
>对象不是值;对象的引用是值.
>对象具有可以更改的状态.*
(*如果他们允许的话.可以创建一个不允许更改状态的对象;那些被称为“不可变”的对象.它可以非常,非常方便和强大.在JavaScript中,你用Object.freeze和类似的方法做到这一点,因为默认情况下对象非常宽松,你只需通过分配就可以为它们添加属性.在许多其他语言中,它更基本:你只是没有定义任何可以改变的公共字段,并且不要不要定义任何改变对象状态的公共方法.)
关于那个“创造变量”挥手,我忽略了那里的两个细节,因为它们并不重要:
>在JavaScript中,var声明在代码开始运行之前处理,因此变量g和b都已在逐步执行代码的第一行之前创建.最初,它们的值未定义.
>因为您在全局范围内使用了var,所以b和g成为全局对象的属性,这是窗口所指向的属性.实际上,窗口本身是全局对象的属性.通过ES5,所有全局变量都是全局对象的属性. (在ES6 / ES2015中,我们有一个新的全局变量类别:使用let,const或class创建的.)
从技术上讲,我们的第一个图应该是这样的:
+--------------------------+ | +-------------------+ | | | (stuff omitted) | | +-->| window: ref429 |--+ +-----------+ | gamelogic: ref758 |------>| | | g: undefined | +-----------+ | b: undefined | +-------------------+
……但是,好吧,这似乎不太有用.
内容总结
以上是互联网集市为您收集整理的javascript – 当我将它设置为等于全局变量时,变量指向何处?全部内容,希望文章能够帮你解决javascript – 当我将它设置为等于全局变量时,变量指向何处?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。