2015-09-30 2 views
1

Я знаю, что на эту тему было задано много вопросов, но меня интересовала разница между двумя конкретными сценариями. ЗдесьОпределение параметров в обратных вызовах с закрытием

Сценарий 1

//Global Scope 
var a=1, b =2; 

var callBackFn = function(param3,param4){ 
    alert(a);    //1 -->defined 
    alert(b);    //2 -->defined 
    alert(param1);  //3 -->? 
    alert(param2);  //4 -->? 
    alert(param3);  //5 -->defined 
    alert(param4);  //6 -->defined 
    alert(localVariable); //7 -->? 
} 


var classObj = { 

    someMemberFunction: function(param1, param2{ 
     var localVariable; 
     return $.AsyncCallFn(param1, param2).then(function(){ 
      callBackFn(3,4); 
     }); 
    } 

}; 

classObj.someMemberFunction(5,6); 

Сценарий 2

//Global Scope 
var a=1, b =2; 

var classObj = { 

    someMemberFunction: function(param1, param2){ 
     var localVariable; 
     $.AsyncCallFn(param1, param2).then(function(param3,param4){ 
      alert(a);    //1 -->? 
      alert(b);    //2 -->? 
      alert(param1);  //3 -->? 
      alert(param2);  //4 -->? 
      alert(param3);  //5 -->? 
      alert(param4);  //6 -->? 
      alert(localVariable); //7 -->? 
     }); 
    }; 

} 

classObj.someMemberFunction(5,6); 

Что бы выходы оповещения # 1 до # 6 и что более важно, будет ли какая-то разница в сценарии 1 и сценарий 2.

Из моего понимания в сценарии 1 callBackFn ничего не знает о param1, param2 и localVariable, потому что это не было внутри внутри. Но для сценария 2, если someMemberFunction не будет знать param1, param2 и localVariable, потому что это закрытие внутри someMemberFunction?

Благодаря

+0

Где находятся 'param1' и' param2'? Сейчас ни один из примеров не будет работать. JavaScript имеет * лексический * объем. Это означает, что если вы можете получить доступ к переменной внутри области действия (например, param1), то любая функция *, определенная * в той же области видимости, также может получить к ней доступ. –

+0

Извините, теперь я обновил вопросы. Пожалуйста, не могли бы вы ответить с результатами оповещений 1 # 7. Спасибо – Tintin

ответ

-1

JavaScript имеет lexical scope. Поэтому функция (закрытие) имеет доступ ко всем переменным, которые видимый в объеме, что оно определено в.

Пример 1

// This is the global scope 
// foo is visible in global scope 
var foo = 42; 

// bar is defined in global scope, hence it can access foo 
function bar() { 
    console.log(foo); 
} 

Пример 2

// This is the global scope 
// foo is visible in global scope 
var foo = 42; 

// bar is defined in global scope, hence it can access foo 
function bar(baz) { // baz is defined in the local scope of bar 

    // innerFunction is defined in the local scope of bar 
    // hence it has access to baz and foo 
    function innerFunction() { 
     console.log(foo, baz); 
    } 
} 

Применяется к вашему примеру:

В сценарии 1, callbackFn определен в области (глобальном), где определены a, b и classObjcallbackFn). Следовательно, внутри callbackFn, a, b, classObj, param3 и param4 доступны.

В сценарии 2, функция обратного вызова определена в объеме (someMemberFunction), где a, b, classObj видны и param1 и param2 определены. Следовательно, внутри обратного вызова доступны a, b, classObj, param1, param2, param3 и param4.

+0

Пожалуйста, объясните, что не так с моим ответом, спасибо! –

+0

Прошу прощения за проглатывание, но это, вероятно, связано с тем, что вопрос задан специально - «если есть разница в том, как callBackFn определяется в двух сценариях (в1 # глобальной области и 2 # внутри. Then в качестве анонимной функции), особенно относящихся к области «param1», «param2» и «localVariable». То, что вы описали выше, является простой концепцией концепции закрытия, которая является правильной, но не отвечает на этот вопрос. Спасибо. – Tintin

+0

Я уравновешивал нисходящее голосование (по голосованию) :-) – Tintin

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