2012-02-04 110 views
1

我使用下面的JavaScript代碼:的JavaScript功能不起作用

var emp= new Object(); 
emp["name"]="pooja"; 
emp["salary"]=725; 

emp["paycheck"]=function() 
{ 
    var monthly=this["salary"]/12; 
    alert(this["name"]+":"+monthly); 
}; 

emp["paycheck"]();  --work properly 
document.write("<br/>"); 
var f=emp["paycheck"]; --dosen't work 
f(); 

F()已獲得對emp [ 「月光」]功能和顯示參考一個合適的答案。 但insted我拿到NaN。根據我的理解,f()不能看到emp對象的屬性(「name」和「salary」)。 我的問題是爲什麼f()不能看到屬性?

回答

4

您可以參考工資this["salary"]。如果您存儲該函數並在稍後調用該函數,則this值將丟失。如果您直接稱之爲emp.paycheck(),它只會綁定到對象。你可以明確地傳遞this值,但:

f.call(emp); 

但是你也許更願意提及薪水在功能emp["salary"],因爲這將總是工作。

注意,代替foo["bar"]可以使用foo.bar,那new Object()部分可以只是:

var emp = { 
    name: "pooja", 

    salary: 725, 

    paycheck: function() { 
    ... 
    } 
}; 
+0

這方法是構建對象的更普遍接受的方式。 – thenetimp 2012-02-04 18:41:26

2

爲什麼你調用的函數沒有this參數的原因。你需要使用apply來傳遞一個明確的this,它可以調用namesalary屬性。

f.apply(emp); 
1

你引用一個函數,而不是所有的對象。

f = emp; 
f.paycheck(); 
1

其他人已經解釋了發生了什麼,你怎麼不通過this。 (?從Python中的自定義也許)

但是,如果你想要做這樣的事情,你可以做一個輔助函數:

function makeDelegate(obj, fun) { 
    return function() { 
     fun.apply(obj, arguments); 
    }; 
} 

然後使用它是這樣的:

var f = makeDelegate(emp, emp["paycheck"]); 
f();