资讯专栏INFORMATION COLUMN

javascript中的地址

idisfkj / 3041人阅读

摘要:简单情况在执行后,的地址被作为参数传入,并以变量名保存。之后,保存的是新对象的地址。所以通过访问地址,显示内容变化。运行,函数中有个局部变量,对其一顿操作后,将这个对象的地址返回,通过赋给。此时指向的地址仍是。所以修改的是地址为的对象。

简单情况
var v1 = {}
function func(obj){
  obj = {
    name:"v1"
  }
}
function fund(obj){
  obj.name = "v1"
}
func(v1)
console.log(v1) // {}
fund(v1)
console.log(v1) // { name: "v1" }

在执行func(v1)后,v1的地址address01被作为参数传入,并以变量名obj保存。obj ={name:"v1"}之后,obj保存的是新对象的地址address04。而v1保存的地址address01没有变化。其后执行fund(v1)v1的地址address01被作为参数传入,并以变量名obj保存。obj.name = "v1",修改地址address01中名为name的值。所以通过v1访问地址,显示内容变化。

复杂情况
function c() {
  var obj = {
    v: 1
  }
  obj.fund = function () {
    obj.v++
  }
  obj.func = function () {
    obj = {
      v: -1
    }
  }
  return obj
}

var c1 = c()
c1.func()
console.log(c1) // { v: 1, fund: [Function], func: [Function] }
c1.fund()
console.log(c1) // { v: 1, fund: [Function], func: [Function] }

首先执行var c1 = c()。运行c()函数c中有个局部变量obj,对其一顿操作后,将这个对象的地址address02返回,通过c1=,赋给c1

接着执行c1.func()函数func调用的是其外部变量obj,原本变量名obj对应的地址是address02,经过obj={v:-1},用新对象的地址address05代替原来的地址。此时c1指向的地址仍是address02。所以c1.fund()修改的是地址为address05的对象。

修改代码证明一下

function c() {
  var obj = {
    v: 1
  }
  obj.fund = function () {
    obj.v++
  }
  obj.func = function () {
    obj = {
      v: -1
    }
  }
  obj.getObj = function () {
    return obj
  }
  return obj
}

var c1 = c()
var innerObj1 = c1.getObj()
c1.func()
var innerObj2 = c1.getObj()
console.log(innerObj1 === innerObj2) // false

在没执行c1.func()之前,函数getObj访问的是函数c中的局部变量obj,其地址是address02。在执行c1.func()之后,函数getObj访问的仍是函数c中的局部变量obj,但其地址已经变成address06

含this的情况
function c() {
  this.obj = {
    v: 1
  };
  this.func = function () {
    this.obj = {
      v: 2
    };
  };
}

var c2 = new c();
var obj1 = c2.obj
c2.func();
console.log(c2.obj.v); // 2
console.log(c2.obj === obj1) // false

最后一个例子
function setName(obj){
    obj.name="ted"; // 第二步
    obj=new Object(); // 第三步
    obj.name="marry"; // 第四步
}
var obj=new Object(); // 第一步
setName(obj); // 进入第二步
console.log(obj.name); // ted

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89484.html

相关文章

  • JavaScript 是如何工作的:JavaScript 的共享传递和按值传递

    摘要:它对数组和对象使用按值传递,但这是在的共享传参或拷贝的引用中使用的按值传参。例如在这里,变量和值在执行期间存储在堆栈中。返回值这是可选的,函数可以返回值,也可以不返回值。变量被推入堆栈,从而在执行时成为的副本。 这是专门探索 JavaScript 及其所构建的组件的系列文章的第 22 篇。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 如果你错过了前面的章节,可...

    keithyau 评论0 收藏0
  • JavaScript 是如何工作的:JavaScript 的共享传递和按值传递

    摘要:它对数组和对象使用按值传递,但这是在的共享传参或拷贝的引用中使用的按值传参。例如在这里,变量和值在执行期间存储在堆栈中。返回值这是可选的,函数可以返回值,也可以不返回值。变量被推入堆栈,从而在执行时成为的副本。 这是专门探索 JavaScript 及其所构建的组件的系列文章的第 22 篇。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 如果你错过了前面的章节,可...

    陈伟 评论0 收藏0
  • 讲清楚之 javascript 参数传值

    摘要:讲清楚之参数传值参数传值是指函数调用时,给函数传递配置或运行参数的行为,包括通过进行传值。所以对的赋值会改变上下文栈中标识符保存的具体值此时如果使用的是按引用传递,则变量所指向的对象因该也被赋值为。 讲清楚之 javascript 参数传值 参数传值是指函数调用时,给函数传递配置或运行参数的行为,包括通过call、apply 进行传值。 在实际开发中,我们总结javascript参数传...

    itvincent 评论0 收藏0
  • [译] 沙箱中的间谍 - 可行的 JavaScript 高速缓存区攻击

    摘要:缓存攻击是和个人电脑相关的一种边信道攻击,因为高速缓冲区被不同的进程和用户使用而导致了信息的泄露。报告中的攻击方式因此是高度可行的对于攻击者的假设和限定是实际的运行的时间是实际的给攻击者带来的好处也是实际的。 原文 The Spy in the Sandbox – Practical Cache Attacks in Javascript 相关论文可在 https://github.c...

    netScorpion 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<