js为何将函数作为对象属性值后,只执行一次?

我们知道在js里面,万物皆对象。
给对象设置各种值是也是常有的事。
然而有时给对象属性的值设为函数时,却发现只执行一次,然后不再执行了,这是为什么呢?


函数只执行一次的现象

基本实现代码如下

var myName="张三";
function fn(name){
return "hello i am "+myName;
}
var obj={
par1:fn(),
}

运行结果

"hello i am 张三"

然后我修改了变量myName
myName="李四";



修改后执行结果还是为:"hello i am 张三"
【说明这个作为对象属性的函数只执行了一次】


函数只执行一次的原因

由于我们将函数赋值为对象属性值时,形式为函数名+括号
也就是 fn().



这种情况就会出现,我们的属性值不是一个函数,而是一个函数的执行结果。也就是函数返回值,如果没有返回值,那么属性结果就是undefined。
这也就是为什么我们后面更改了函数返回的变量的值后,属性值没变。因为属性的值不是一个函数,只是第一次函数执行时返回的结果


函数只执行一次的解决办法

既然知道了其原因是将函数赋值给对象属性时,由于加了个括号。从而赋值的是函数调用执行后返回的结果。
那么解决办法一:
给对象属性赋值时,只赋值函数名。不要括号
如下



运行结果如下:
(此时就ok了,对象属性的值是一个函数了,每次修改函数依赖的变量后,属性值就会跟着改变)



解决方法二:
给函数属性赋值时直接赋值一个匿名函数。如下:
var myName="张三";
var obj={
par1:function(){
return "hello i am "+myName;
},
}

运行结果如下:
(此时也ok了,对象属性的值是一个函数了,每次修改函数依赖的变量后,属性值就会跟着改变)



总结下:

  1. 如果函数是在对象之外定义的。
    那么想要将函数作为对象属性的值的话,只能将函数名赋值给对象属性。赋值时调一定不要加括号。使用时为obj.pro(),属性名加一个括号。
  2. 如果函数直接就是定义在对象属性后的匿名函数,那么对象属性的值直接就是函数,调用时方式同上为obj.pro(),属性名加一个括号。
    也就是对象属性的值直接就是函数,那么调用时就必须加上一个括号!
    如: obj.par1();

你可能感兴趣的:(js为何将函数作为对象属性值后,只执行一次?)