2011-09-21 4 views
3

제 질문은 JavaScript Closure와 Eval() 함수에 관한 것입니다.JavaScript 클로저 - Eval() 및 Eval()의 범위에서 변수 캡처

이 코드는 일부 jQuery 플러그인 관련 코드가 표시되지 않습니다. 필요한 경우 더 많은 코드로 질문을 업데이트 할 수 있습니다. AsynchronousBind 함수가 호출 될 때를 평가 및 _CurrentDataRowIndex rowData를 포착되지

var _CurrentDataRowIndex = 1; 

function LoadParsedRowTemplate(rowData, type) { 

    var result; 
    var asyncbinder = /&\{[\S\s]*?}&/g; 

     while ((result = asyncbinder.exec(template)) != null) { 
      replacement = eval("$.fn.ScreenSetup." + result[0].substring(2, result[0].length - 3) + ", rowData, " + _CurrentDataRowIndex + ")"); 
      template = template.replace(result[0], "AsyncBind!!"); 
      asyncbinder.lastIndex = 0; 
     } 

} 

function AsynchronousBind(asyncFunc, args, rowData, rowIndex) { 

    var watchTimer; 

    asyncFunc.apply(this, Array.prototype.slice.call(args.FunctionArgs, 0)); 

    watchTimer = setInterval(function() { 

     if (args.finished) { 
      clearTimeout(watchTimer); 
     } 
     else { 
      try { 
       console.log("watching the async function for a return on row: " + rowIndex); 
      } 
      catch (err) { 
      } 
     } 

    }, 1000); 

} 

은 모두 정의된다. eval은 클로저와 어떻게 작동합니까? rowData 및 rowIndex 인수가 AsynchronousBind에서 정의되지 않은 이유가 궁금합니다.

편집

:

내가 평가 (의 논쟁의 성격을 알고는) 그러나이 방화벽 응용 프로그램 뒤에입니다, 나는 평가를 사용하여 우리가 이미 작성한 플러그인에 추가 해요 HTML 및 JavaScript가 포함 된 템플릿을 구문 분석합니다.

"$.fn.ScreenSetup.AsyncBind(_CurrentDataRow.isPromotionAvailable, { 
    'FunctionArgs': {'doAsync' : true, 
         'finished' : false}, 
     'Property': 'isPromotionAvailable()', 
     'ControlType': 'TextBox', 
     'ControlIdPrefix': 'promoAvail'}, rowData, 3)" 

편집 (고정) :

I 첨가시 rowData를하고 rowItem II는 다음 변경 잊었 실현 여기

문자열의 일례는 평가()에 전달되고 내 플러그인에서 :

var asyncMethods = { 
    AsyncBind: function (func, args) { return AsynchronousBind(func, args) } 
} 

가되어하는의해야 :

var asyncMethods = { 
    AsyncBind: function (func, args, rowData, rowIndex) { return AsynchronousBind(func, args, rowData, rowIndex) } 
} 

이 업데이트는 AsyncBind 함수에서 정의되지 않은 참조를 수정했습니다.

+0

질문에 "eval"이 포함되어 있으면 대답은 다음과 같습니다. ** do not **. – Quentin

+6

점 표기법을 사용하여 속성에 액세스하는 방법 만 알고 있기 때문에'eval'을 사용하려고하는 것처럼 보입니다. 대신에 [대괄호 표기법] (http://www.dev-archive.net/articles/js-dot-notation/)에 대해 알아보십시오. – Quentin

+1

팁 : 평가판을 사용하지 마십시오. 당신이하고 싶은 일에 필요하지 않습니다. 게다가 지나가는 코드는 유효하지 않습니다. 시작 괄호가 없습니다. –

답변

5

Understanding eval scope은 흥미로운 기사입니다. 범위가 브라우저간에 일치하지 않음을 보여줍니다. eval을 사용해야하는 경우 전역 범위에있는 것으로 간주해야하며 전역 변수 이름이 로컬에서 평가되는 경우 로컬 범위에서 다시 사용하지 마십시오.

더 나은 아직, 그냥 평가를 사용하지 마십시오. 다른 옵션이있을 수 있습니다.

+3

문서 링크를 제공해 주셔서 감사합니다. – dmck

관련 문제