2016-12-05 3 views
0

Я ограничивающей функции consctructor Foo как:Scope Внутри конструктора объекта Function

function Foo() { 
    var a= 0; 
    this.b = 1; 
    this.f1= function() { return a; }; 
    this.f2= function() { return b; }; 
} 

и я создаю объект как:

var bar= new Foo(); 

return b не работает, я должен использовать return this.b вместо. Но он отлично работает с переменной a. Зачем?

+0

Ключевое слово это не значит, что вы думаете, что делает в этом контексте сэр. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this –

+0

Потому что нет переменной с именем 'b' – Oriol

ответ

0

Ваша функция объявляет два типа конструкций. var a - это нормальная переменная, которая привязана к функции и является частной функцией. Его можно использовать любым способом, который требуется функции, поэтому возвращение его вообще не проблема. Самое главное, его значение не изменится с одного экземпляра Foo на следующий.

b, f1 и f2 не объявляются как переменные. Они объявляются как «свойства экземпляра», что означает, что их данные будут меняться от одного экземпляра объекта к другому. Если вы хотите вернуть значение свойства экземпляра, вы должны использовать this, чтобы вернуть значение, связанное с этим конкретным экземпляром.

В конце концов, если Вы писали:

var obj1 = new Foo(); 
obj1.b = 10; 

var obj2 = new Foo(); 
obj1.b = 20; 

Как вы могли бы сохранить эти два b значения отделяются друг от друга? Ответ заключается в том, что у вас есть два экземпляра объекта Foo, а переменные и obj2 хранят ссылку на свой собственный экземпляр.

При написании obj1.b вам необходимо получить доступ к объекту b, принадлежащему объекту obj1. Ключевое слово this делает это за вас.

Читайте подробнее:

this объект связывания является летучим в JavaScript ... то есть, это не всегда указывает на тот же объект и его связывание может меняться от одной строки кода к очень следующий. Как вы вызываете код, содержащий слово this, определяет, к какому объекту он будет привязан.

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

Если код, который содержит this вызывается:

  1. В качестве метода или свойства экземпляра объекта (через переменную экземпляра):

    var o = new Object(); 
    
    // "this" will be bound to the "o" object instance 
    // while "someProperty" and "someMethod" code executes 
    o.someProperty = someValue; 
    o.someMethod(); 
    
  2. Через .call(), .apply(), .bind() или Array.prototype.fn вызов:

    // "this" will be bound to the object suppled as the "thisObjectBinding" 
    someFunction.call(thisObjectBinding, arg, arg); 
    someFunction.apply(thisObjectBinding, [arg, arg]); 
    var newFunc = someFunction.bind(thisObjectBinding, arg, arg); 
    

    Кроме того, некоторые Array.prototype методы позволяют для thisObject быть принят, который будет изменять привязку для продолжительности вызова метода:

    Array.prototype.every(callbackfn [ , thisArg ]) 
    Array.prototype.some(callbackfn [ , thisArg ]) 
    Array.prototype.forEach(callbackfn [ , thisArg ]) 
    Array.prototype.map(callbackfn [ , thisArg ]) 
    Array.prototype.filter(callbackfn [ , thisArg ]) 
    
  3. Если ни один из других сценариев не применяются, по умолчанию связывание происходит.

    3a. Действует "use strict": this is undefined

    3b. Без "use strict" в действие: this связывается с глобальным объектом

** Примечание: this связывания также могут быть затронуты при использовании eval(), но в качестве общего передового опыта, использование eval() следует избегать.

+0

. Другим источником является также MY post. Я другой источник. –

+0

LFAO. Ну, по крайней мере, я поднимусь. : - \ –

+0

Спасибо. Хотя, я думаю, вы должны повысить, потому что это правильный ответ. –

0

Когда функция

f1 

вызывается, он спрашивает это среда/контекст «Извините, у вас есть какие-либо идеи, что [а] пожалуйста?». Он отвечает «Не здесь, но позвольте мне спросить мою собственную среду/контекст, знает ли он, что [а] ... ах, он говорит, что знает, что [а] есть, а его значение равно 0.».

Когда функция

f2 

вызывается, он спрашивает он задает тот же вопрос [б], как f1 сделал для [г] ... разница есть, окружающая среда/контекст он смотрит в для [b] не включает экземпляр Foo, к которому прикреплен [b].

«это» на JavaScript является сложной темой и подробно освещена в этом документе free online book, который является частью серии «Вы не знаете JS», автор Kyle Simpson. Очень хорошая серия.

0

Он не возвращается, потому что b не объявлен.

function Foo() { 
    var a = 0; 
    this.b = 1; 
    var b = this.b; 
    this.f1= function() { return a; }; 
    this.f2= function() { return b; }; 
} 

должно работать нормально.

Или вы можете связать f2 метод «это» и вернуть его:

function Foo() { 
    var a= 0; 
    this.b = 1; 
    this.f1= function() { return a; }; 
    this.f2= (function() { return this.b; }).bind(this); 
} 
+0

В первом коде обратите внимание, что переменная 'b' не будет отображать значение' this.b'. – Oriol

+0

Конечно, это не будет. В первом примере 'b' всегда будет 1 –

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