我正在使用以下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 [“paycheck”]函数的参考并显示合适的答案。 但是我得到了NaN。
据我所知,f()不会看到emp对象的属性(“name”和“salary”)。 我的问题是为什么f()看不到属性?
答案 0 :(得分: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() {
...
}
};
答案 1 :(得分:2)
您之所以调用没有this
参数的函数。您需要使用apply
向其传递一个明确的this
,可以在其上调用name
和salary
属性。
f.apply(emp);
答案 2 :(得分:1)
你引用一个函数,而不是所有对象。
f = emp;
f.paycheck();
答案 3 :(得分:1)
您没有将这些属性复制到f
。遗憾的是,在JavaScript中没有本地方法可以做到这一点。请参阅How do I correctly clone a JavaScript object?或What is the most efficient way to deep clone an object in JavaScript?,查看jQuery的extend()
或google“javascript深层复制对象”或“javascript克隆对象”。
答案 4 :(得分:1)
其他人已经解释了发生了什么以及你如何通过this
。
但是,如果你想做这样的事情(可能是Python的一个自定义?),你可以创建一个帮助函数:
function makeDelegate(obj, fun) {
return function() {
fun.apply(obj, arguments);
};
}
然后像这样使用它:
var f = makeDelegate(emp, emp["paycheck"]);
f();