programing

문자열을 JavaScript 함수 호출로 변환하는 방법

copyandpastes 2022. 10. 1. 22:30
반응형

문자열을 JavaScript 함수 호출로 변환하는 방법

나는 다음과 같은 끈을 얻었다.

settings.functionName + '(' + t.parentNode.id + ')';

다음과 같은 함수 호출로 변환합니다.

clickedOnItem(IdofParent);

자바스크립트settings.functionName + '(' + t.parentNode.id + ')';다 맞는 것 같아요.변환될 함수를 호출하기만 하면 됩니다.

범례:

settings.functionName = clickedOnItem

t.parentNode.id = IdofParent

내가 평가를 싫어하고 혼자가 아닌 걸 보면:

var fn = window[settings.functionName];
if(typeof fn === 'function') {
    fn(t.parentNode.id);
}

편집: @Mahan의 코멘트에 대한 응답:이 특별한 경우,settings.functionName"clickedOnItem"에 번역됩니다var fn = window[settings.functionName];var fn = window["clickedOnItem"]는 ''를 수 있습니다function clickedOnItem (nodeId) {}, 「한다」( 「변수」를 호출한다)에 의해서,이할 수 fn(t.parentNode.id) 경우)와 같음)입니다.clickedOnItem(t.parentNode.id)그게 작전본부가 원했던 거야

자세한 예:

/* Somewhere: */
window.settings = {
  /* [..] Other settings */
  functionName: 'clickedOnItem'
  /* , [..] More settings */
};

/* Later */
function clickedOnItem (nodeId) {
  /* Some cool event handling code here */
}

/* Even later */
var fn = window[settings.functionName]; 
/* note that settings.functionName could also be written
   as window.settings.functionName. In this case, we use the fact that window
   is the implied scope of global variables. */
if(typeof fn === 'function') {
    fn(t.parentNode.id);
}
window[settings.functionName](t.parentNode.id);

eval()은 필요 없습니다.

다음으로 스코프를 지원하면서 동일한 작업을 수행하는 보다 일반적인 방법을 제시하겠습니다.

// Get function from string, with or without scopes (by Nicolas Gauthier)
window.getFunctionFromString = function(string)
{
    var scope = window;
    var scopeSplit = string.split('.');
    for (i = 0; i < scopeSplit.length - 1; i++)
    {
        scope = scope[scopeSplit[i]];

        if (scope == undefined) return;
    }

    return scope[scopeSplit[scopeSplit.length - 1]];
}

그게 사람들을 도울 수 있기를 바랍니다.

JavaScript에는 문자열을 평가하여 코드로 실행하는 함수가 있습니다.

eval(settings.functionName + '(' + t.parentNode.id + ')');

eval()은 필요한 함수이지만 eval 사용을 최소화하기 위해 다음 중 하나를 시도해 보는 것이 좋습니다.그 중 하나가 당신에게 이해될 수 있기를 바랍니다.

함수 저장

함수를 문자열이 아닌 함수로 저장하고 나중에 함수로 사용합니다.기능을 실제로 어디에 저장할지는 사용자에게 달려 있습니다.

var funcForLater = clickedOnItem;

// later is now
funcForLater(t.parentNode.id);

또는

someObject.funcForLater = clickedOnItem;    
// later is now    
(someObject.funcForLater)(t.parentNode.id);

스토어기능명

함수 이름을 문자열로 저장해야 하는 경우에도 다음을 수행하여 복잡성을 최소화할 수 있습니다.

(eval(settings.functionName))(t.parentNode.id);

구축 및 평가해야 하는 Javascript의 양을 최소화합니다.

핸들러 사전

필요한 모든 작업 함수를 개체에 넣고 문자열을 사용하여 사전 스타일이라고 합니다.

// global
itemActions = { click: clickedOnItem, rightClick: rightClickedOnItem /* etc */ };

// Later...
var actionName = "click"; // Or wherever you got the action name
var actionToDo = itemActions[actionName];
actionToDo(t.parentNode.id);

노트 (「」: 여기서 구문을 사용한 경우)itemActions[actionName](t.parentNode.id); 이 는 '이러다'의 .itemActions

첫 번째 답변은 좋고 평가는 싫지만, 다른 방법(평가와 비슷한 방법)이 있기 때문에 사용하지 않고 우회할 수 있다면 사용하는 것이 좋습니다.단, ajax 호출 전후에 javascript 코드를 호출하고 싶은 경우가 있습니다.이 코드가 ajax가 아닌 커스텀아트리뷰트에 있는 경우는, 다음과 같이 사용할 수 있습니다.

    var executeBefore = $(el).attr("data-execute-before-ajax");
    if (executeBefore != "") {
        var fn = new Function(executeBefore);
        fn();
    }

또는 여러 번 호출해야 할 경우 최종적으로 함수 캐시에 저장합니다.

다시 - 다른 방법이 있을 경우 eval 또는 이 방법을 사용하지 마십시오.

함수 이름을 문자열로 가져와서 호출하고 인수를 함수에 전달할 수 있기를 원했습니다.이 질문에 대한 선택된 답변을 얻을 수 없었지만, 이 답변은 정확하게 설명했고, 여기 짧은 데모가 있습니다.

function test_function(argument)    {
    alert('This function ' + argument); 
}

functionName = 'test_function';

window[functionName]('works!');

이는 여러 인수에도 사용할 수 있습니다.

한다면settings.functionName는 이미 함수입니다.이렇게 할 수 있습니다.

settings.functionName(t.parentNode.id);

그렇지 않으면 이 방법도 동작합니다.settings.functionName는 함수의 이름일 뿐입니다.

if (typeof window[settings.functionName] == "function") {
    window[settings.functionName](t.parentNode.id);
}

이건 알아내는 데 시간이 좀 걸렸어요.window['someFunctionName']()처음에는 통하지 않았다.내 함수 이름은 데이터베이스에서 AJAX 응답으로 가져옵니다.또, 어떠한 이유로든, 제 기능은 윈도우의 범위외에 선언되어 있기 때문에, 이것을 수정하기 위해서, 호출하고 있던 기능을 고쳐 쓸 필요가 있었습니다.

function someFunctionName() {}

로.

window.someFunctionName = function() {}

거기서 전화할 수 있었어요window['someFunctionName']()쉽게 할 수긍할 수 있습니다.이게 누군가에게 도움이 됐으면 좋겠어!

저는 다음과 같은 것을 사용하는 것을 선호합니다.

window.callbackClass['newFunctionName'] = function(data) { console.log(data) };
...
window.callbackClass['newFunctionName'](data);

Nicolas Gauthier의 답변에 근거합니다.

var strng = 'someobj.someCallback';
var data = 'someData';

var func = window;
var funcSplit = strng.split('.');
for(i = 0;i < funcSplit.length;i++){
   //We maybe can check typeof and break the bucle if typeof != function
   func = func[funcSplit[i]];
}
func(data);

javascript에서는 Common을 사용합니다.예를 들어 node.js와 같은 JS 사양은 아래에 나와 있는 작업을 수행할 수 있습니다.문자열로 변수에 액세스 할 때 매우 편리합니다.window물건.라는 이름의 클래스가 있는 경우MyClass, Common 내에서 정의되어 있습니다.MyClass.js라는 이름의 JS 모듈

// MyClass.js
var MyClass = function() {
    // I do stuff in here. Probably return an object
    return {
       foo: "bar"
    }
}

module.exports = MyClass;

그런 다음 MyOtherFile.js라는 다른 파일에서 이 멋진 마술을 할 수 있습니다.

// MyOtherFile.js

var myString = "MyClass";

var MyClass = require('./' + myString);
var obj = new MyClass();

console.log(obj.foo); // returns "bar"

공통적인 이유 하나 더JS는 정말 즐거워요.

eval("javascript code");

JSON을 다룰 때 광범위하게 사용됩니다.

언급URL : https://stackoverflow.com/questions/912596/how-to-turn-a-string-into-a-javascript-function-call

반응형