2012-02-04 3 views
1

Я использую следующий код JavaScript:функция 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() должен получить ссылку на эх функции [ "зарплата"] и дисплей подходящий ответ. но insted я получаю NaN.

Как я понял, f() не видит свойства объекта emp («имя» и «зарплата»). Мой вопрос в том, почему f() не видит свойства?

ответ

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() { 
    ... 
    } 
}; 
+0

Этот метод является гораздо более общепринятым способом построения объекта. – thenetimp

2

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

f.apply(emp); 
1

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

f = emp; 
f.paycheck(); 
1

Вы не скопировали эти свойства до f. К сожалению, нет никаких естественных способов сделать это в JavaScript. См. How do I correctly clone a JavaScript object? или What is the most efficient way to deep clone an object in JavaScript?, посмотрите на extend() jQuery или «объект глубокой копии javascript» или «объект клонирования javascript».

1

Другие объяснили, что происходит и как вы не проходите this. (? Обычай с Python возможно)

Однако, если вы хотите сделать что-то вроде этого, вы можете сделать вспомогательную функцию:

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

Затем использовать его как это:

var f = makeDelegate(emp, emp["paycheck"]); 
f(); 
Смежные вопросы