2010-01-10 2 views
3

В чем разница между функциями внутри объекта. У меня есть 2 примера, которые в основном делают то же самое.Разница в Javascript между функциями внутри объекта

function a(param) { 
    function b(input) { 
     return input%10; 
    }; 
return 'The result is ' + b(param); 
}; 

и

function a(param) { 
    this.b=function(input) { 
     return input%10; 
    }; 
return 'The result is ' + this.b(param); 
}; 

Что такое преимущество и disadvatages в обоих случаях? Во втором я знаю, что эту функцию можно вызвать извне главной функции. Есть ли разница при запуске? (например, время и производительность)

ответ

11

Вы должны быть осторожны со вторым примером, ключевое слово this будет ссылаться на объект Global, если вы вызываете функцию без оператора new, и, посмотрев на свое возвращаемое значение, кажется, что вы не пытаются сделать constructor function.

Я думаю, что вам нужно знать, как this ключевого слова (контекст функции) работает:

this ключевое слово неявно набор, когда:

1- Когда функция вызывается как метод (функция вызывается в качестве члена объекта):

obj.method(); // 'this' inside method will refer to obj 

2- нормальный вызов функции:

myFunction(); // 'this' inside the function will refer to the Global object 
// or 
(function() {})(); 

3- Когда оператор new используется:

var obj = new MyObj(); // this will refer to a newly created object. 

И вы также можете установить this ключевое слово явно, с методами call и apply:

function test() { 
    alert(this); 
} 

test.call("Hello world"); // alerts 'Hello world' 

Теперь, разница между функцией b двух ваших примеров - это в основном то, что в первом фрагменте, b - это объявление функции , в вашем втором примере b - это выражение функции .

Объявление функции подчиняется hoisting, и они вычисляются во время разбора, в выражениях функций определяются во время выполнения.

Если вы хотите более подробную информацию о различиях между декларациями функций и функциональных выражений, я оставляю вам некоторые ресурсы:

И BTW, вам не нужно semicolon after function declarations.

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