변수에 이름이 지정된 JavaScript 함수 호출
이 질문에는 이미 답변이 있습니다.
JavaScript 함수의 이름을 포함하는 JavaScript 변수가 있습니다. 이 기능은 $ .ajax 등을 사용하여로드하고 배치하여 페이지에 존재합니다.
변수에 이름이 지정된 자바 스크립트 함수를 어떻게 호출 할 수 있습니까?
현재 페이지에 삽입되는 페이지 조각을로드하는 데 사용되는 URL에 호출 할 함수의 이름이 포함되므로 함수 이름이 변수에 있습니다.
이 솔루션을 구현하는 방법에 대한 다른 제안이 열려 있습니다.
나는 평가를 피할 것이다.
이 문제를 해결하려면 JavaScript에 대해 다음 사항을 알아야합니다.
- 함수는 일류 객체이므로 객체의 속성 (이 경우 메소드 라고 함 ) 또는 배열의 요소가 될 수 있습니다.
- 함수가 속한 개체를 선택하지 않으면 전역 범위에 속합니다. 브라우저에서, 이것은 전역이있는 "window"라는 개체에 매달려 있다는 것을 의미합니다.
- 배열과 객체는 밀접한 관련이 있습니다. (소문은 근친상간의 결과 일 수도 있습니다!)
.
대괄호 대신 점을 사용[]
하거나 그 반대의 경우도 종종 있습니다 .
문제는 대괄호 방식이 아닌 점 참조 방식을 고려한 결과입니다.
그래서 왜 안되죠?
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
'Programing' 카테고리의 다른 글
유형 또는 네임 스페이스 이름 'DbContext'를 찾을 수 없습니다. (0) | 2020.06.19 |
---|---|
문자열에 적어도 하나의 소문자, 대문자, 숫자 및 기호가 포함되어 있는지 확인 (0) | 2020.06.19 |
PHP에서 세션 시간 초과를 변경하는 방법은 무엇입니까? (0) | 2020.06.19 |
텍스트 OpenCV 추출 (0) | 2020.06.19 |
LEFT OUTER JOIN은 왼쪽 테이블에있는 것보다 더 많은 레코드를 어떻게 반환 할 수 있습니까? (0) | 2020.06.19 |