2010-03-11 4 views
2

나는 이것이 가능하지 않다고 생각합니다. 프로덕션 환경에서이 작업을 수행 할 것이라고 확신합니다. 이것은 가상의 "궁금하다면 ... 내가 할 수있는 ..."것 중 하나 일뿐입니다.브라우저 자바 스크립트 엔진에 대한 이론적 인 질문

브라우저 JavaScript 엔진이 런타임에 코드를 구문 분석하는 방법을 수정하거나 확장 할 수 있는지 궁금합니다. 예를 들면 :

var x = myJsObjCollection.Where(a=>a.ID == 2); 

내가 나 자신을 스크립트의 구문 분석을 수정하고 람다 코드를 차단하고 그것을 구문 분석 할 수 없습니다 : 내가 자바 스크립트에서 C# 스타일의 람다 구문을 사용하려한다면?

답변

3

를 참조하십시오.

자바 스크립트를 구문 분석하고 실행하는 엔진은 클라이언트의 브라우저에 있으며, 따라서 어떤 웹 사이트에서도 수정하거나 변경할 수 없습니다 (희망 사항).

잠재적으로 당신은 람다 표현식을 기술하기 위해 자바 스크립트 지원 유형과 구문을 사용할 수 있으며 유효한 자바 스크립트 호출로 그것을 확장하는 자신의 자바 스크립트 라이브러리를 가질 수 있습니다.

그러나 javascript 기능이 이미 매우 유연하므로 유용하지 않습니다. 유효한 JS에서 위의 코드는 동일한 C# 대리자처럼 보입니다.

var x = myJsObjCollection.Where(function() { if (this.ID == 2) return this; }); 

어떤 형식으로도 작업 할 필요가 없습니다.

업데이트

잠재적으로 이런 걸 쓸 수있는, 몇 단계를 더 Bob's Idea을하려면 다음

function lambda(vName, comparison) 
{ 
    var exp = new RegExp("\\b" + vName + "\\.", "g"); 
    comparison = comparison.replace(exp, "arg."); 
    return function(arg) { 
     var result; 
     eval("result = " + comparison + ";"); 
     return result; 
    }; 
} 

당신의 기능과 같이 보일 것이다 장소 :

Array.prototype.Where = function(lambdaFunc) { 
    var matches = [];  
    for (var i in this) 
    { 
     if (lambdaFunc(this[i])) 
      matches[matches.length] = this[i] 
    } 
    return matches; 
}; 

을 그리고 전화하실 수 있습니다 :

var x = myJsObjCollection.Where(lambda("a", "a.ID == 2")); 

작업 예제는 http://jsbin.com/ifufu/2/edit입니다.

+0

쿨. 당신은 또한 "a => a.ID === 2"와 같은 문자열로 람다 인수를 남겨두고 "=>"로 나눌 수 있도록 split을 호출 할 수 있습니다 ... 멀리 떨어진 공간을 잘라 내기 위해 구문 분석이 필요할 수도 있습니다 – Bob

1

자바 스크립트에서 직접 수정할 방법이 없습니다. 당신이 얻을 수있는 가장 가까운 것은 원하는 코드를 해석 할 수있는 자신의 eval 타입 함수를 작성하는 것입니다.

또는의 V8 자바 스크립트 엔진 소스 코드를 얻을이 일부 변경을하고, 당신이 그것을 어떻게 든 크롬에서 구현 얻을 수 있다면 :) 나는 그것을 의심

+0

사용자 정의 평가 아이디어가 좋습니다. 'lambdaEval ("a => a.ID == 2");'와 같은 것. 그러나 파싱이 많이 필요할 것입니다. – Joel

+0

내 대답을 확인하십시오 : functional.js :-) – Pointy