2014-01-09 2 views
3

Есть ли какая-то разница, когда я явно возвращаюсь из функции против неявного возврата?Любая разница между явным и неявным возвратом в функции javascript?

Вот код, который озадачивает мне банкомат:

function ReturnConstructor(arg){ 
    // Private variable. 
    var privateVar = "can't touch this, return ctor."; 

    // This is what is being exposed to the outside as the return object 
    return { 
     print: function() { 
      console.log("ReturnConstructor: arg was: %s", arg); 
     } 
    }; 
} 

function NormalConstructor(arg){ 
    // Private variable. 
    var privateVar = "can't touch this, normal ctor"; 

    // This is what is being exposed to the outside as "public" 
    this.print = function() { 
      console.log("NormalConstructor: arg was: %s", arg); 
     }; 
} 

var ret = new ReturnConstructor("calling return"); 
var nor = new NormalConstructor("calling normal"); 

Оба объекта («RET» & «ни») кажутся мне то же самое, и мне интересно, если это только личные предпочтения, кого писал зависимости от того, статью, которую я прочитал до сих пор, или там есть какие-то скрытые ловушки.

ответ

5

Когда вы используете new, существует неявное значение. Когда вы не использовать new, нет.

Когда функция, вызванная с new, возвращает объект, то это значение выражения new. Когда он возвращает что-то другое, это возвращаемое значение игнорируется, а объект, неявно построенный, является значением выражения.

Итак, есть, может быть разница.

+1

Таким образом, с помощью 'уаг V = new ... 'в моем вопросе, они одинаковы. Разница вступила в игру, когда я делаю что-то вроде: «ReturnConstructor (« hello »). Print()', который является допустимым и будет печатать: 'ReturnConstructor: arg was: hello', потому что он возвращает объект, который имеет' print ', в отличие от' NormalConstructor («hello») ', который возвращает' undefined', и будет вызывать ошибку, если я попытаюсь использовать метод print() для неопределенного объекта. (Я все еще не уверен, кто будет использовать его таким образом, хотя ... какие-нибудь примеры?) – Noctis

+1

Право - оператор 'new' сильно влияет на семантику вызова функции. Без 'new' обычный вызов функции для функции без явного возвращаемого значения приводит к' undefined'. – Pointy

0

неявный возврат происходит только для отдельных функций оператора стрелки, кроме случаев, когда функция стрелки объявлена ​​с {}, даже если это один оператор, неявный возврат не бывает: link

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