2015-02-12 1 views
0

Я думал JavaScript, ниже, приведет к obj.fn работать в контексте entryPoint().Функция-вызова контекстного

Но когда obj.fn() работает, 'locVar is undefined' исключение.

function entryPoint() { 
    var locVar = "xxx"; 
    var obj = {}; 

    PassRcvr(obj); 

    obj.fn(); 

    } 

    function PassRcvr(passedObj) { // Being an object, the arg is passed by reference. 
    passedObj.fn = function () { 
     alert(locVar); 
    } 
    } 

JScript, ниже, однако делает бег с осознанием locVar.

function entryPoint() { 
    var locVar = "xxx"; 
    var obj = {}; 

    PassRcvr(obj); 

    obj.fn(); 

    function PassRcvr(passedObj) { 
     passedObj.fn = function () { 
     alert(locVar); 
     } 
    } 

    } 

Почему не obj.fn() известно о том контексте, в котором оно называется, в обоих случаях, а не только один?

+0

Javascript является лексически (или «статическим») языком, который вам нужен, является «динамическим» охватом. Есть языки, которые его поддерживают, но Javascript этого не делает. – georg

ответ

1

контексте - значение this. Вы не используете его, поэтому он не имеет отношения к вашей проблеме.

scope не передается. Функция сохраняет область, в которой она была объявлена ​​(поэтому мы можем использовать закрытие в JS). Так как PassRcvr не определен внутри entryPoint в первом примере, он не имеет доступа к переменным, которые имеют область действия до entryPoint.

+0

Я не знал, что язык JS имеет спецификацию, в которой функции сохраняют область, в которой они объявлены. Это, конечно, объяснило бы это. –

1

В первом случае PassRcvr находится в глобальной области действия, в то время как locVar находится в пределах entryPoint функции локальной области действия - поэтому к ней невозможно получить доступ.

Во втором случае оба PassRcvr и locVar находятся в одном местном масштабе.

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

  • Нет связанных вопросов^_^