Ваша функция объявляет два типа конструкций. 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
вызывается:
В качестве метода или свойства экземпляра объекта (через переменную экземпляра):
var o = new Object();
// "this" will be bound to the "o" object instance
// while "someProperty" and "someMethod" code executes
o.someProperty = someValue;
o.someMethod();
Через .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 ])
Если ни один из других сценариев не применяются, по умолчанию связывание происходит.
3a. Действует "use strict"
: this
is undefined
3b. Без "use strict"
в действие: this
связывается с глобальным объектом
** Примечание: this
связывания также могут быть затронуты при использовании eval()
, но в качестве общего передового опыта, использование eval()
следует избегать.
Ключевое слово это не значит, что вы думаете, что делает в этом контексте сэр. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this –
Потому что нет переменной с именем 'b' – Oriol