new Function 생성 함수에서 MVC 모드 연상
new Function( 1, 2, ..., N, )
안의 매개 변수는 모두 문자열의 형식으로 표시됩니다.예를 들어 간단한 예는 함수를 써서 두 숫자 중 가장 큰 숫자를 구하고 가장 큰 숫자를 되돌려 달라는 것이다.만약 성명식 함수의 사상에 따라 쓴다면, 아마도 이렇게 될 것이다
function max(a,b){
return a > b ? a : b;
}
그러나 우리는 함수 구조기(new Function)로 전환하여 쓴다.
var fn = new Function('a','b','return a>b?a:b');
var max = fn(1,2);
max; //2
물론 여기를 보면 함수 구조기의 방식으로 함수를 만드는 것이 성명식 함수에 비해 어느 정도 우세하다는 것을 알 수 없다.그러나 우리는 다음 약간 복잡한 예를 계속 보았다.
함수를 써서 임의의 매개 변수를 전송하여 최대치를 구하세요.우리는 이 두 가지 방법으로 그것을 썼다.
function max() {
var a = arguments;
var m = a[0];
for (var i = 0; i < a.length; i++) {
if (m < a[i]) {
m = a[i];
}
}
return m;
}
var res = max(1, 5, 16, 3,2);
console.log(res); //16
var fn = new Function(
'var a = arguments;'+
'var m = a[0];'+
'for (var i = 0; i < a.length; i++) {'+
' if (m < a[i]) {'+
' m = a[i];'+
' }'+
'}'+
'return m;'
);
var res = fn(1,5,16,3,2);
console.log(res); //16
그리고 우리는 위의 코드를 최적화해서 함수체를 추출하여 독립된script 라벨에 놓을 수 있다.
<script id="control">
/*
var max = arguments[0];
for(var i=0;i<arguments.length;i++){
if(arguments[i]>max){
max = arguments[i];
}
}
return max;
*/
</script>
<script>
var fn = new Function(
document.getElementById('control').innerHTML
.trim()
.replace('/*', '')
.replace('*/', '')
)
var foo = fn(1,2,10,4)
console.log(foo) //10
</script>
이렇게 쓰는 장점은 함수 방법을 변경해야 할 때 첫 번째 스크립트 탭에서만 변경하면 다음 스크립트 탭에 영향을 주지 않는다는 것이다.
함수 구조기의 작용역에 대한 문제를 조금 더 보충합니다. 성명식 함수와 달리 성명식 함수 내부는 외부나 외함수의 국부 변수에 접근할 수 있지만 함수 구조기는 할 수 없습니다.
var globalVal = 'global'
function fn(){
var localVal = 'local';
function foo(){
console.log(typeof localVal,typeof globalVal);
}
foo()
}
fn() //string string
var globalVal = 'global'
function fn(){
var localVal = 'local';
new Function('console.log(typeof localVal,typeof globalVal);')();
}
fn() // undefined global
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.