문자열을 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
'programing' 카테고리의 다른 글
python 함수 내부의 매개 변수 이름 목록을 가져오는 중 (0) | 2022.10.01 |
---|---|
Blob을 바이트 배열로 변환하는 가장 쉬운 방법 (0) | 2022.10.01 |
목록 이해에서의 이중 반복 (0) | 2022.10.01 |
PHP의 cURL을 사용하여 리다이렉트할 곳을 찾으려면 어떻게 해야 하나요? (0) | 2022.10.01 |
MySQL 5.7을 새로운 MySQL 8.0으로 업데이트하려면 어떻게 해야 합니까? (0) | 2022.10.01 |