函数类型的变量

来源:15-1 变量类型和计算-1

玥玥颜

2019-02-12

var a = function(){console.log(111)};
var b =a;

修改a的函数体

a = function(){console.log(112)};

再次打印a的结果是:
ƒ (){console.log(112)}
再次打印b的结果如下:

ƒ (){console.log(111)}

既然函数属于引用类型,为什么当变量a改变时变量b没有跟着改变呢?试过对象,数组都是可以的

写回答

2回答

林橙子

2019-02-14

因为a指向了一个新的函数,而b还是指向原来的函数。  
我们通常在对象中是这样应用的: 

var a = {x: 1}
var b = a
a.x = 2 
console.log(b)   => {x:2}

这时,a依然指向原来的对象。但是,当:

var a = {x: 1}
var b = a
a = {y:1}
console.log(a)   => {y:1}
console.log(b)   => {x:1}

这时,a指向了新的对象。你的例子同理。

0
1
玥玥颜
非常感谢!
2019-02-14
共1条回复

AqingCyan

2019-02-13

函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没有什么不同。换句话说,一个函数可能有多个名字

function sum(num1, num2){
    return num1 + num2;
}
alert(sum(10, 10)); // 20

var anotherSum = sum;
alert(anotherSum(10, 10)); // 20

sum = null;
alert(anotherSum(10, 10)); // 20

以上代码首先定义了一个名为sum()的函数,用于求两数之和,然后又声明了变量anotherSum,并且把其值设为何sum一样,那么实际上是把指向sum函数的指针赋值给anotherSum,anotherSum和sum都指向同一个函数,而后,sum赋值为null,就是sum指针断开了与函数的关系,所以anotherSum能正常调用函数。

那么你的问题就很显而易见了,你将a = function(){console.log(112)};实际上是将a指针指向了新的函数,所以b不影响调用原来的函数。

3
0

BAT大牛带你横扫初级前端JavaScript面试(第二版)

BAT高级前端工程师亲授,结合真实面试题,提高面试成功几率

4268 学习 · 817 问题

查看课程