JavaScript函数不起作用

时间:2012-02-04 18:32:18

标签: javascript javascript-objects

我正在使用以下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()看不到属性?

5 个答案:

答案 0 :(得分:4)

您将薪水称为this["salary"]。如果存储该函数并稍后调用它,this值将丢失。如果您直接调用它,它仅绑定到该对象,如emp.paycheck()中所示。您可以明确地传递this值:

f.call(emp);

但您可能更愿意将函数中的薪水称为emp["salary"],因为这将始终有效。

请注意,您可以使用foo["bar"]代替foo.barnew Object()部分可以是:

var emp = {
  name: "pooja",

  salary: 725,

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

答案 1 :(得分:2)

您之所以调用没有this参数的函数。您需要使用apply向其传递一个明确的this,可以在其上调用namesalary属性。

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();