변수에 명명된 자바스크립트 함수 호출
자바스크립트 함수의 이름을 포함하는 자바스크립트 변수가 있습니다.$.ajax 등을 사용하여 페이지에 로드 및 배치된 기능입니다.
변수에 있는 javascript 함수를 어떻게 부르는지 알려주실 분 계신가요?
페이지 조각(현재 페이지에 삽입됨)을 로드하는 데 사용되는 URL에 호출할 함수의 이름이 포함되어 있으므로 함수의 이름이 변수에 포함됩니다.
저는 이 해결책을 어떻게 구현할 것인지에 대한 다른 제안을 받아들일 용의가 있습니다.
평가는 피하겠습니다.
이 문제를 해결하기 위해서는 자바스크립트에 대해 다음과 같은 것들을 알아야 합니다.
- 함수는 일급 객체이므로 객체의 속성(이 경우 메소드라고 함)이거나 배열의 요소일 수도 있습니다.
- 함수가 속한 개체를 선택하지 않으면 전역 범위에 속합니다.브라우저에서, 그것은 당신이 그것을 세계가 사는 곳인 "창"이라는 이름의 물체에 걸고 있다는 것을 의미합니다.
- 배열과 물체는 밀접하게 연관되어 있습니다. (심지어 근친상간의 결과일 수도 있다는 소문도 있습니다.대괄호 대신 점을 사용하거나 그 반대의 경우도 있습니다.
당신의 문제는 사각형 브라켓 방식보다는 도트 기준 방식을 고려한 결과입니다.
그럼 왜 그런 건 안 되는 거지?
window["functionName"]();
그것은 당신의 기능이 글로벌 공간에 산다고 가정하는 것입니다.네임스피드를 했다면 다음과 같습니다.
myNameSpace["functionName"]();
eval 및 setTimeout 및 setInterval에 문자열을 전달하지 않도록 합니다.저는 JS를 많이 쓰고, 평가는 절대 필요 없습니다."필요하다"는 평가는 언어를 충분히 깊이 알지 못하는 것에서 나옵니다.범위 지정, 문맥 및 구문에 대해 배울 필요가 있습니다.만약 평가가 막히게 된다면, 그냥 물어보세요--빨리 배울 수 있을 겁니다.
전 세계적인 범위에 있다면 다음을 사용하는 것이 더 좋습니다.
function foo()
{
alert('foo');
}
var a = 'foo';
window[a]();
보다eval().왜냐면eval()evaaaaaal 입니다.
바로 Nosredna가 40초 전에 말한 것처럼 그것은 >.<
반드시 사용을 피합니다.eval이와 같은 작업을 수행하지 않으면 XSS(사이트 간 스크립팅) 취약성에 노출됩니다.
예를 들어, 만약 당신이 사용한다면.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' 카테고리의 다른 글
| 스프링-부트-스타터-테스트에서 데이터베이스 통합 테스트를 실행할 수 없음 (0) | 2023.10.22 |
|---|---|
| C로 인쇄하는 방법 (0) | 2023.10.22 |
| 전체 컨텍스트에서 git diff를 얻으려면 어떻게 해야 합니까? (0) | 2023.10.22 |
| 'ID' 특성 대신 'Class'를 사용하도록 WordPress Jetpack 플러그인 수정 (0) | 2023.10.22 |
| Python Pandas는 데이터 프레임의 행을 복제합니다. (0) | 2023.10.22 |