js函数内部修改外部传入的(引用类型的)变量,导致的修改结果异常

题目一:
function setN(obj){
obj.name='屌丝';
obj = new Object()
obj.name = '腐女';
};
var per = new Object();
setN(per);
alert(per.name); //屌丝
  • 解释:改变的是函数内部变量的值。
    之所以传入的外部参数也改变是因为 (引用类型)内存地址传递给了函数内的变量,函数内部变量拿着地址 去修改了 堆内存 里面的值。
    之后,函数内部的变量又被重新赋值,变成了 new Object () 的地址 。再进行改变则不会影响之前传入的地址。
    (见执行栈示意图,或耐心看完下一题)
题目二:
var a = { n: 1 };
var b = a;
a.x = a = { n: 2 }
a.x // -> undefined
b.x // -> { n: 2 }

首先:. 的优先级 高于 =
a = { n: 1 } -> [栈地址a = 00XXX11] // 00XXX11 对应的值是 { n : 1 }
b = a -> [栈地址b = 00XXX11]
a.x = a = { n: 2 }

  • 先执行 a.x : 00XXX11.x =
  • 从右到左赋值: [栈地址a = 00XXX11] -> [栈地址a = 00XXX22] // 00XXX22 对应的值是 { n : 2 }
  • 返回第一步: 00XXX11.x -> { n: 2 } // [00XXX11 = 00XXX22]
所以: a.x 相当于 00XXX22.x => { n: 2 }.x 输出: undefined ; b.x 相当于 00XXX11.x => { x: { n: 2 } }.x 输出: { n: 2 }
 执行栈 中的 示意图 :

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在JavaScript中,匿名方法(也被称为闭包)是一种非常强大和常用的概念,它允许我们访问和引用外部作用域中的变量。 在使用匿名方法引用外部变量时,我们可以将外部变量作为参数传递给匿名方法,或者直接在匿名方法内部引用外部变量。 例如,我们有一个外部变量`x`,并且我们希望在一个匿名方法中使用它: ```javascript var x = 10; var myFunction = function() { console.log(x); // 这里可以访问和引用外部变量x } myFunction(); // 输出:10 ``` 上述例子中,我们声明了一个匿名方法`myFunction`,在这个匿名方法中我们通过`console.log(x)`来打印外部变量`x`的值。当我们调用`myFunction()`时,它将输出外部变量`x`的值,即`10`。 匿名方法不仅仅是简单地引用外部变量,它还可以修改和重新赋值外部变量。我们可以通过匿名方法来创建一个函数工厂,它根据传入的参数来生成不同的函数。 ```javascript var createMultiplier = function(n) { return function(x) { return n * x; }; }; var double = createMultiplier(2); console.log(double(5)); // 输出:10 var triple = createMultiplier(3); console.log(triple(5)); // 输出:15 ``` 在上面的例子中,我们定义了一个`createMultiplier`函数,它接收一个参数`n`,并返回一个匿名方法。这个匿名方法接收参数`x`,并将`n`和`x`相乘返回结果。 我们可以调用`createMultiplier`方法来创建不同的函数。`double`函数将参数乘以2,而`triple`函数将参数乘以3。这些函数通过引用外部变量`n`来实现功能,`n`的值由调用`createMultiplier`时传入的参数决定。 总结起来,通过使用匿名方法,我们可以引用和修改外部变量,这为我们提供了更大的灵活性和功能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值