Programing

변수에 이름이 지정된 JavaScript 함수 호출

crosscheck 2020. 6. 19. 18:58
반응형

변수에 이름이 지정된 JavaScript 함수 호출


이 질문에는 이미 답변이 있습니다.

JavaScript 함수의 이름을 포함하는 JavaScript 변수가 있습니다. 이 기능은 $ .ajax 등을 사용하여로드하고 배치하여 페이지에 존재합니다.

변수에 이름이 지정된 자바 스크립트 함수를 어떻게 호출 할 수 있습니까?

현재 페이지에 삽입되는 페이지 조각을로드하는 데 사용되는 URL에 호출 할 함수의 이름이 포함되므로 함수 이름이 변수에 있습니다.

이 솔루션을 구현하는 방법에 대한 다른 제안이 열려 있습니다.


나는 평가를 피할 것이다.

이 문제를 해결하려면 JavaScript에 대해 다음 사항을 알아야합니다.

  1. 함수는 일류 객체이므로 객체의 속성 (이 경우 메소드 라고 함 ) 또는 배열의 요소가 될 수 있습니다.
  2. 함수가 속한 개체를 선택하지 않으면 전역 범위에 속합니다. 브라우저에서, 이것은 전역이있는 "window"라는 개체에 매달려 있다는 것을 의미합니다.
  3. 배열과 객체는 밀접한 관련이 있습니다. (소문은 근친상간의 결과 일 수도 있습니다!) .대괄호 대신 점을 사용 []하거나 그 반대의 경우도 종종 있습니다 .

문제는 대괄호 방식이 아닌 점 참조 방식을 고려한 결과입니다.

그래서 왜 안되죠?

window["functionName"]();

그것은 당신의 기능이 전 세계 공간에 있다고 가정합니다. 네임 스페이스가 있다면 :

myNameSpace["functionName"]();

평가를 피하고 문자열을 setTimeout 및 setInterval에 전달하지 마십시오. 나는 많은 JS를 작성하며 평가가 필요하지 않습니다. "필요한"평가는 언어를 충분히 알지 못하는 것에서 비롯됩니다. 범위, 컨텍스트 및 구문에 대해 배워야합니다. 당신이 평가에 갇혀 있다면, 그냥 물어-당신은 빨리 배울 수 있습니다.


글로벌 범위에 있다면 사용하는 것이 좋습니다.

function foo()
{
    alert('foo');
}

var a = 'foo';
window[a]();

보다 eval(). 때문에이 eval()있다 evaaaaaal .

정확히 Nosredna가 40 초 전에 말한 것처럼>. <


eval이와 같은 일을하는 것을 하지 않으면 XSS (Cross-Site Scripting) 취약점에 노출 될 것입니다.

예를 들어 eval여기에 제안 된 솔루션 을 사용하는 경우 악의적 인 사용자가 다음과 같은 피해자에게 링크를 보낼 수 있습니다.

http://yoursite.com/foo.html?func=function () {alert ( 'Im % 20In % 20Teh % 20Codez');}

그리고 당신의 것이 아닌 자바 스크립트가 실행될 것입니다. 이 코드는 물론 경고를 표시하는 것보다 훨씬 나쁜 일을 할 수 있습니다. 쿠키를 훔치고 응용 프로그램에 요청을 보낼 수 있습니다.

따라서 eval사용자 입력 (및 쿼리 문자열 ID의 모든 항목이 사용자 입력으로 간주 됨)에서 오는 신뢰할 수없는 코드 를 절대 사용하지 마십시오 . 사용자 입력을 함수를 가리키는 키로 사용할 수 있지만 주어진 문자열이 객체의 키와 일치하지 않으면 아무것도 실행하지 않아야합니다. 예를 들면 다음과 같습니다.

// set up the possible functions:
var myFuncs = {
  func1: function () { alert('Function 1'); },
  func2: function () { alert('Function 2'); },
  func3: function () { alert('Function 3'); },
  func4: function () { alert('Function 4'); },
  func5: function () { alert('Function 5'); }
};
// execute the one specified in the 'funcToRun' variable:
myFuncs[funcToRun]();

funcToRun변수가 myFuncs객체의 어떤 것도 가리 키지 않으면 실패 하지만 코드를 실행하지는 않습니다.


이것은 다소 추한 일이지만 내 머리에 터지는 첫 번째 것입니다. 또한 인수를 전달할 수 있어야합니다.

eval('var myfunc = ' + variable);  myfunc(args, ...);

인수를 전달할 필요가없는 경우이 방법이 더 간단 할 수 있습니다.

eval(variable + '();');

표준 드라이 코드 경고가 적용됩니다.

참고 URL : https://stackoverflow.com/questions/1723287/calling-a-javascript-function-named-in-a-variable

반응형