繁体   English   中英

JavaScript功能不起作用

[英]JavaScript function doesn't work

我正在使用以下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对象(“名称”和“薪水”)的属性。 我的问题是为什么f()没有看到属性?

您将薪金称为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() {
    ...
  }
};

原因是您在没有this参数的情况下调用该函数。 您需要使用apply为其传递一个明确的this ,它可以在其上调用namesalary属性。

f.apply(emp);

您引用的是函数,而不是所有对象。

f = emp;   
f.paycheck();

您没有将这些属性复制到f 不幸的是,没有使用JavaScript的本地方法。 请参阅如何正确克隆JavaScript对象? 在JavaScript中深度克隆对象的最有效方法是什么? ,请查看jQuery的extend()或Google“ javascript深度复制对象”或“ javascript克隆对象”。

其他人则解释了发生了什么,以及您如何不通过this

但是,如果您想做这样的事情(也许是来自Python的自定义?),则可以创建一个辅助函数:

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

然后像这样使用它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM