Функция JavaScript не работает - PullRequest
1 голос
/ 04 февраля 2012

Я использую следующий код 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 ]

4 голосов
/ 04 февраля 2012

Вы ссылаетесь на зарплату как 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() {
    ...
  }
};
2 голосов
/ 04 февраля 2012

Причина, по которой вы вызываете функцию без параметра this.Вам необходимо использовать apply для передачи ему явного this, для которого он может вызывать свойства name и salary.

f.apply(emp);
1 голос
/ 04 февраля 2012

Другие объяснили, что происходит и как вы не проходите this.

Однако, если вы хотите сделать что-то подобное (возможно, кастом из Python?), Вы можете сделать вспомогательную функцию:

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

Тогда используйте это так:

var f = makeDelegate(emp, emp["paycheck"]);
f();
1 голос
/ 04 февраля 2012

Вы не скопировали эти свойства в f. К сожалению, в JavaScript нет нативных способов сделать это. См. Как правильно клонировать объект JavaScript? или Каков наиболее эффективный способ глубокого клонирования объекта в JavaScript? , посмотрите на jQuery extend() или gavascript скопировать объект "или" javascript clone объект ".

1 голос
/ 04 февраля 2012

вы ссылаетесь на функцию, а не на весь объект.

f = emp;   
f.paycheck();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...