2014-02-09 2 views
0

Я наткнулся на проблему, которую я видел раньше, но этого я раньше не мог решить. Я, скорее всего, наткнусь на него снова в будущем, так что, пожалуйста, кто-нибудь объяснит мне, что происходит?

В частичном фрагменте javascript ниже у меня есть функция, которая заполняет экран, включая команду combobox (twitter bootstrap). Когда я нажимаю на один из элементов заказа в этом поле со списком, он должен вызывать функцию clsModCampaigns.blnCompaniesListReload().

По причине того, что я не понимаю, когда-то внутри итератора $ .each, глобальная ссылка на объект 'objModCampaigns' теряется? Я получаю успешное предупреждение «1», но не предупреждение «2».

Внутри $ .each я хотел бы использовать 'objModCampaigns.arrOrderBy' вместо 'this.arrOrderBy', но итератор $ .each, похоже, работает именно так. Почему это так работает?

Что происходит с этим «или» с переменными/объектами, назначенными в корне класса с «этим»?

Есть ли $ .each только специальные ???

function clsModCampaigns(objSetSystem, objSetModuleBase) 
{ 
    objModCampaigns = this; 
    arrOrderBy = { 
    intID: 'ID', 
    strName: 'Name'}; 

    [...] 

    this.blnScreenCampaignInitialize = function (fncSuccess,fncError, intID) { 
    $.each(this.arrOrderBy, function (strFieldName, strFieldDescription) { 
     if(strFieldName != 'datDeleted' || objSystem.blnHasPerm("CAMPAIGNS_DELETED")) { 
     strOrderByID = "ulCampaignsCompaniesListOrderBy" + strFieldName; 
     $("#ulCampaignsCompaniesListOrderBy").append('<li><a href="#" id="'+strOrderByID+'">'+strFieldDescription+'</a></li>'); 
     $("#"+strOrderByID).unbind("click").bind("click", function() { 

      alert("1"); 
      objModCampaigns.arrCurrentShownCompanies.strOrderBy = strFieldName; 
      objModCampaigns.blnCompaniesListReload(); 
      alert("2"); 

     }); 
     } 
    }); 
    return true; 
    }; 
} 
+0

Внутри '$ .each()' http://code.jquery.com/jquery-1.11.0.js – loveNoHate

+0

почему вы не используете 'var' для объявлений переменных? – naomik

+0

@naomik: должен ли я? Кажется, это работает в других местах? –

ответ

0

код у вас есть

$.each(this.arrOrderBy, ...); 

Вы хотите

$.each(arrOrderBy, ...); 

Причиной этому является this контекст на этой линии отличается тем, что он находится внутри новой функции this.blnScreenCampaignInitialize.

Это лишь часть того, как JavaScript работает

var message = "hello"; 

function welcome() { 
    console.log(message); 
} 

welcome(); // "hello" 

P.S.var

Если вы не используете var, вы будете прикреплять все свои vars к глобальному объекту.

function hello() { 
    foo = "bar"; 
    console.log(foo); 
}; 

hello();   // "bar" 
console.log(foo); // "bar" 
// Holy smokes! `foo` has escaped our `hello` function! 

Сравните это

function hello() { 
    var foo = "bar"; 
    console.log(foo); 
} 

hello();   // "bar" 
console.log(foo); // ReferenceError: foo is not defined 
// much better 

Теперь давайте посмотрим Страшный пример

function a() { 
    b = 5; 
    return b; 
} 

function b() { 
    return "function"; 
} 

console.log(a()); // 5 
console.log(b()); // TypeError: number is not a function 

Это происходит потому, что мы не использовали var должным образом. Сначала определим b, но после запуска a(), b теперь установлено на 5. Второй оператор журнала эквивалентен попытке запуска 5(), потому что b больше не является функцией.


P.P.S. Это непривычно для приставки ваших vars: str, int, fnc, obj, или cls в JavaScript.

Я понимаю, что вы «парень VB» в соответствии с вашими комментариями, но это не повод для приведения ваших собственных условностей на язык. Я вижу в вашем профиле, что вы свободно владеете нидерландским, английским, немецким и французским языками. Я бы рекомендовал, чтобы вы относились к языкам программирования обучения так же, как к устным языкам: каждый из них имеет свой собственный набор правил и соглашений.

Вот куча free JavaScript books для вас. Надеюсь, они помогут вам научиться другим основам.


P.P.P.S. В целом, ваша функция действительно велика, и я вижу, что вы уже усекали часть кода с помощью своего [...]. Возможно, все это принесет пользу из лучшего состава.

Если вы вставляете весь свой код, возможно, кто-то может помочь вам лучше.

+0

Я проверил это, вы правы, он работает с вашим предложенным способом удаления этого. Но это не объясняет это, просто сделайте его еще более запутанным !! Как область видимости изменяется от локальной функции до глобальной функции класса, в пределах $ .each() ???? –

+0

На небольшой заметке у вас есть ссылка о важности «var»? Кроме того, я согласен с тем, что в jscript нетривиальных префиксов vars с индикаторами типа, но я человек VB, придерживающийся принципов ясности старого типа ... –

+0

Я внес некоторые изменения для решения других вопросов. – naomik

0
What is going on inside the $.each() ? 

Что касается вас вопрос названия, я пытаюсь ответить:

// each function in source 
function (obj, callback, args) { 
    //... 
} 

Проверьте источник полной $.each function самостоятельно, вы можете увидеть исходный код какой-либо функции просто набрав имя функции в соответствующее текстовое поле (второе сверху).

Здесь в each функции, массив/объекте, передаваемом в each функции (первый аргумент) в настоящее время проходит через петлю и каждое значение передается в к callback (второму аргументу), и что обратный вызову становится выполнено, как:

callback.apply(obj[i], args); 

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

Если ваша функция function clsModCampaigns(){ //... } является нормальной функцией, то this внутри этой функции указывает на глобальный window объект. так просто использовать:

$.each(arrOrderBy, ...); 

вместо

$.each(this.arrOrderBy, ...); 

Потому что, arrOrderBy находится в пределах прямой сферы так arrOrderBy доступен directrly. Например:

function someThing() 
{ 
    var x = 'y'; //<-- this scope (everything inside someThing) is 
       // global for somethingElse inner function 

    function someThingElse)(x) //<-- possible to use directly 
    { 

    } 
} 

по ключевому слову this ведет себя по-разному в зависимости от контекста. Проверьте около this на MDN.

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