Во втором примере вы используете закрытие.
Закрытие больше o
.. Это означает, что this
даже не используется. Тем не менее, у него есть свои преимущества, это трюк, который вы можете использовать для создания защищенных объектов / инкапсуляции и т. Д. c.
. Например, ниже я превратил ваш пример в рабочий фрагмент. Затем я делаю ссылку на функцию getX
в обоих случаях, а затем вызываю ее. Вы заметите, что первое 1 возвращает неопределенное значение, но второе, потому что вы используете замыкание, все еще возвращает 6
.
Конечно, недостатком является то, что call
apply
& bind
не будет иметь эффект на функцию тоже. Какой вариант вы выберете, конечно, зависит от того, как вы хотите использовать функцию, в вашем примере использование closure
кажется более надежным вариантом. Теоретически, closure
также может иметь небольшое преимущество в производительности, потому что this
имеет нечто, называемое цепочкой прототипов, и это может замедлить процесс ..
function Foo() {
this.x = 5;
}
Foo.prototype.fc1 = function() {
return {
x: 6,
getx() {
return this.x;
}
}
}
Foo.prototype.fc2 = function() {
const o = {
x: 6,
getx() {
return o.x;
}
}
return o;
}
const f = new Foo();
console.log('calling foo.fc1.getx');
const fc1 = f.fc1().getx;
console.log(fc1());
console.log('calling foo.fc2.getx');
const fc2 = f.fc2().getx;
console.log(fc2());