我們知道在js里面愉镰,萬(wàn)物皆對(duì)象米罚。
給對(duì)象設(shè)置各種值是也是常有的事。
然而有時(shí)給對(duì)象屬性的值設(shè)為函數(shù)時(shí)丈探,卻發(fā)現(xiàn)只執(zhí)行一次录择,然后不再執(zhí)行了,這是為什么呢碗降?
函數(shù)只執(zhí)行一次的現(xiàn)象
基本實(shí)現(xiàn)代碼如下
var myName="張三";
function fn(name){
return "hello i am "+myName;
}
var obj={
par1:fn(),
}
運(yùn)行結(jié)果
"hello i am 張三"
然后我修改了變量myName
myName="李四";
修改后執(zhí)行結(jié)果還是為:"hello i am 張三"
【說(shuō)明這個(gè)作為對(duì)象屬性的函數(shù)只執(zhí)行了一次】
函數(shù)只執(zhí)行一次的原因
由于我們將函數(shù)賦值為對(duì)象屬性值時(shí)隘竭,形式為函數(shù)名+括號(hào)
也就是 fn().
這種情況就會(huì)出現(xiàn),我們的屬性值不是一個(gè)函數(shù)讼渊,而是一個(gè)函數(shù)的執(zhí)行結(jié)果动看。也就是函數(shù)返回值,如果沒(méi)有返回值爪幻,那么屬性結(jié)果就是undefined菱皆。
這也就是為什么我們后面更改了函數(shù)返回的變量的值后,屬性值沒(méi)變挨稿。因?yàn)閷傩缘闹挡皇且粋€(gè)函數(shù)仇轻,只是第一次函數(shù)執(zhí)行時(shí)返回的結(jié)果
函數(shù)只執(zhí)行一次的解決辦法
既然知道了其原因是將函數(shù)賦值給對(duì)象屬性時(shí),由于加了個(gè)括號(hào)。從而賦值的是函數(shù)調(diào)用執(zhí)行后返回的結(jié)果奶甘。
那么解決辦法一:
給對(duì)象屬性賦值時(shí)篷店,只賦值函數(shù)名。不要括號(hào)
如下
運(yùn)行結(jié)果如下:
(此時(shí)就ok了臭家,對(duì)象屬性的值是一個(gè)函數(shù)了船庇,每次修改函數(shù)依賴的變量后吭产,屬性值就會(huì)跟著改變)
解決方法二:
給函數(shù)屬性賦值時(shí)直接賦值一個(gè)匿名函數(shù)。如下:
var myName="張三";
var obj={
par1:function(){
return "hello i am "+myName;
},
}
運(yùn)行結(jié)果如下:
(此時(shí)也ok了鸭轮,對(duì)象屬性的值是一個(gè)函數(shù)了臣淤,每次修改函數(shù)依賴的變量后,屬性值就會(huì)跟著改變)
總結(jié)下:
- 如果函數(shù)是在對(duì)象之外定義的窃爷。
那么想要將函數(shù)作為對(duì)象屬性的值的話邑蒋,只能將函數(shù)名賦值給對(duì)象屬性。賦值時(shí)調(diào)一定不要加括號(hào)按厘。使用時(shí)為obj.pro(),屬性名加一個(gè)括號(hào)医吊。 - 如果函數(shù)直接就是定義在對(duì)象屬性后的匿名函數(shù),那么對(duì)象屬性的值直接就是函數(shù)逮京,調(diào)用時(shí)方式同上為obj.pro(),屬性名加一個(gè)括號(hào)卿堂。
也就是對(duì)象屬性的值直接就是函數(shù),那么調(diào)用時(shí)就必須加上一個(gè)括號(hào)懒棉!
如: obj.par1();