2013-08-28 2 views
1

В этом W3Schools example, я не получаю, как changeName работы:JavaScript: функция Определение внутри функции

function person(firstname, lastname, age, eyecolor) { 
    this.firstname = firstname; 
    this.lastname = lastname; 
    this.age = age; 
    this.eyecolor = eyecolor; 

    this.changeName = changeName; 

    function changeName(name) { 
     this.lastname = name; 
    } 
} 
myMother = new person("Sally", "Rally", 48, "green"); 
myMother.changeName("Doe"); 
document.write(myMother.lastname); 

http://jsfiddle.net/MrGe4/

Почему мы this.changeName=changeName, а затем определение функции для changeName?

+2

Не могли бы вы показать, что вы пытались? – Neal

+2

И ** пожалуйста ** не использовать w3schools ... – Neal

+0

Могу ли я узнать причину для downvote? – ADJ

ответ

4

Это определение метода changeName для person объектов - но в каком-то окольным путем, эквивалент (и лучше) способ сделать это:

this.changeName = function(name) { 
    this.lastname = name; 
} 

(Отсюда ' пожалуйста, не используйте W3School ')

+0

Не обязательно лучше, потому что теперь функции анонимны не названы. – Bergi

+0

@Bergi: извините, я не понимаю возражения - зачем вам нужна/нужна именованная функция? – MiMo

+0

Они помогают в отладке, а иногда делают код более удобочитаемым. http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html – Bergi

1

Вот вы код (Из обращения вы сделали):

<!DOCTYPE html> 
<html> 
<body> 
<script> 
function person(firstname,lastname,age,eyecolor) 
{ 
this.firstname=firstname; 
this.lastname=lastname; 
this.age=age; 
this.eyecolor=eyecolor; 

this.changeName=changeName; 
function changeName(name) 
{ 
this.lastname=name; 
} 
} 
myMother=new person("Sally","Rally",48,"green"); 
myMother.changeName("Doe"); 
document.write(myMother.lastname); 
</script> 

</body> 
</html> 

При вводе этого кода:

function changeName(name) 
{ 
this.lastname=name; 
} 

вы в основном делает функцию.

И когда вы сделаете это:.

this.changeName=changeName; 

вы в основном говорят, что «функция changeName (на РИТ) принадлежит эту функцию, то есть человек (Тем не менее, человек используется в качестве объект)»

Поэтому, когда вы видите, код, указанный по вашей ссылке, глобальный код определяет объект myMother и он обращается changeName через myMother.changeName() только потому, что вы сказали, this.changeName = changeName

+1

Небольшой отступ не будет ошибкой ... – Bergi

1

This.changeName - это свойство.

this.changeName = changeName - это просто объявление функции.

//Here you create your Person Object 
myMother=new person("Sally","Rally",48,"green"); 

//Here you affect the LastName "Doe" By calling the ChangeName function of the object Person 
myMother.changeName("Doe"); 
+0

Назначение функции не влияет на свойство 'lastName'. – Bergi

+0

устанавливает для этого свойства lastname значение «Doe». –

+0

Это когда вы * вызываете * метод. Только назначение функции ('this.changeName = changeName') не делает этого. – Bergi

1

В JavaScript этот код:

function foo() { 
    function changeName() { 

    } 
    this.changeName = changeName; 
} 

таких же, как

function foo() { 
    this.changeName = changeName; 
    function changeName() { 

    } 
} 

Это еще потому грузоподъемный в JavaScript всех declartions являются гнали в начале интерпретатором.

1

Вот дополнительные ответы на некоторые вероятные вопросы:

JavaScript имеет только две области:

  1. Global Scope

  2. Функция Scope

Существует нет область блока в JavaScript!

Все переменные, объявленные внутри области действия, доступны, как если бы все они были объявлены в начале этой области, из-за переменной подъемной силы.

Именно поэтому рекомендуется объявлять всю переменную в начале своей области, чтобы лучше отражать реальность, возможно, в одном объявлении var.

например.

function person(firstname, lastname, age, eyecolor) { 
    var changeName = function (name) { 
     this.lastname = name; 
    } 
    this.firstname = firstname; 
    this.lastname = lastname; 
    this.age = age; 
    this.eyecolor = eyecolor; 

    this.changeName = changeName; 

} 

Фактически, в этом случае переменная или именованная функция вообще не нужны.

Просто назначить анонимную функцию свойство объекта непосредственно:

function person(firstname, lastname, age, eyecolor) { 
    this.firstname = firstname; 
    this.lastname = lastname; 
    this.age = age; 
    this.eyecolor = eyecolor; 
    this.changeName = function (name) { 
     this.lastname = name; 
    } 
} 

инструментов, как JSLint или JSHint помогут вам улучшить свой код JavaScript.

См. this sample @ codepen.io (нажмите CTRL + SHIFT + 7 в редакторе JS) и JSHint use at codepen.io.

Наконец, Mozilla Developer Network - гораздо лучший ресурс, чем W3Schools.

Это даже научит вас document.write Notes, что не является хорошей практикой.

+0

Спасибо за подробное объяснение, +1 специально для упоминания 'Javascript' не имеет области блока – ADJ

Смежные вопросы