[英]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
,它可以在其上调用name
和salary
属性。
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.