programing

변수에 명명된 자바스크립트 함수 호출

jooyons 2023. 10. 22. 20:03
반응형

변수에 명명된 자바스크립트 함수 호출

자바스크립트 함수의 이름을 포함하는 자바스크립트 변수가 있습니다.$.ajax 등을 사용하여 페이지에 로드 및 배치된 기능입니다.

변수에 있는 javascript 함수를 어떻게 부르는지 알려주실 분 계신가요?

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

저는 이 해결책을 어떻게 구현할 것인지에 대한 다른 제안을 받아들일 용의가 있습니다.

평가는 피하겠습니다.

이 문제를 해결하기 위해서는 자바스크립트에 대해 다음과 같은 것들을 알아야 합니다.

  1. 함수는 일급 객체이므로 객체의 속성( 경우 메소드라고 함)이거나 배열의 요소일 수도 있습니다.
  2. 함수가 속한 개체를 선택하지 않으면 전역 범위에 속합니다.브라우저에서, 그것은 당신이 그것을 세계가 사는 곳인 "창"이라는 이름의 물체에 걸고 있다는 것을 의미합니다.
  3. 배열과 물체는 밀접하게 연관되어 있습니다. (심지어 근친상간의 결과일 수도 있다는 소문도 있습니다.대괄호 대신 점을 사용하거나 그 반대의 경우도 있습니다.

당신의 문제는 사각형 브라켓 방식보다는 도트 기준 방식을 고려한 결과입니다.

그럼 왜 그런 건 안 되는 거지?

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

반응형