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();
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 10,128评论 0 5
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,801评论 1 32
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 13,115评论 0 3
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 7,921评论 2 9
  • 第一章 错误处理: 错误: 程序运行过程中,导致程序无法正常执行的现象(即bug) 现象: 程序一旦出错,默认会报...
    fastwe阅读 4,840评论 0 1