2016-04-22 3 views
0
var Test = (function() { 
    return { 
     someValue: 69, 
     staticMethod: function(){ 
      return this.someValue; 
     } 
    } 
}()); 

console.log(Test.staticMethod()); 

var doIt = Test.staticMethod 
console.log(doIt()) 

Выход:это не определено, при вызове переменной набор для статического метода

69 
undefined 

Ожидаемое:

69 
69 

Почему this не существует в контексте второго вызова ?

Демо: http://jsbin.com/kidefoniko/edit?js,console

+0

Потому что функция вызывается без объекта как контекста. Это значение любой функции зависит от контекста выполнения. – adeneo

+0

, так что правильный путь 'doIt.call (Test)'? Что, если я не знаю, что это Тест? В любом случае, чтобы узнать его контекст – LearningJrDev

+0

Не совсем, контекст - это то, что вы установили, это не предопределено. Когда вы выполняете 'Test.staticMethod()' вы устанавливаете контекст в 'Test', во втором примере вы создаете ссылку на эту функцию, а затем вызываете ее без контекста, поэтому вам нужно использовать' call', 'apply' или 'bind', чтобы установить контекст. – adeneo

ответ

0

doIt ссылки на ту же функцию staticMethod делает:

function(){ 
    return this.someValue; 
} 

this в основном объект перед . В случае этого вызова: Test.staticMethod() это Test

но здесь: doIt() нет ., поэтому нет объекта перед точкой. В таких случаях this присваивается глобальному объекту (если не в строгом режиме). Глобальный объект (window в браузере) не имеет свойства someValue, поэтому undefined вышел из системы.

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