>웹 프론트엔드 >JS 튜토리얼 >자바스크립트 팁 2.5_javascript 팁

자바스크립트 팁 2.5_javascript 팁

WBOY
WBOY원래의
2016-05-16 18:19:421136검색

이전 블로그 포스팅에서 자바스크립트가 람다 표현식 과 비슷한 프로그래밍 기능을 갖게 만드는 방법을 소개한 적이 있습니다. 하지만 자바스크립트의 구문 검사와 호환되어야 하므로 여러 상황에서 사용할 수 있습니다. 제한된.

그러나 좀 더 세심한 친구들은 내가 그 (유사) 람다 모듈에서 몇 가지 트릭을 사용했다는 것을 발견했을 것입니다. 이제 다음 팁을 소개하겠습니다.

1. 구문 검사를 수행합니다.

프레임워크를 작성하려는 학생들은 이에 대해 깊은 느낌을 가지고 있어야 합니다. 때로는 코드를 통해 생성된 코드가 기술적 실수로 인해 문법 오류가 발생하여 작동 중에 비정상적인 중단이 발생할 수 있습니다. 사용자 입력을 받아들이지만 사용자는 의도적으로 또는 의도하지 않게 잘못된 문장이나 표현을 작성할 수 있습니다.
일부 학생들은 이 문제를 해결하기 위해 의도적으로 복잡한 구문 검사 프로세스를 작성(또는 기성품을 사용)합니다. 그러나 코드 구문을 분석하기 위해 코드를 작성하는 것은 매우 고통스러운 일이며 일단 문제가 발견되면 조정하는 것도 매우 어렵습니다. .불편하다.
사실 이 문제에 대한 더 간단한 해결책은 eval이나 new Function과 같은 스크립트 엔진 자체의 구문 검사를 사용하는 것입니다. 물론 이 eval을 무분별하게 사용할 수는 없습니다. eval을 부적절하게 사용하면 문제가 있습니다. 그러나 new Function은 그렇게 큰 문제가 아닙니다. new Function에 의해 생성된 함수는 어떤 상황에서도 전역 범위에서 직접 작동하지만 단지 구문 검사일 경우에는 문제가 발생하지 않습니다. 범위 문제. 실제로 이를 통해 생성된 새 함수를 직접 호출하지 않는 한 예상치 못한 결과가 발생합니다.

2. eval에서 허용하는 매개변수 앞에 "0"을 추가합니다.

사실 이는 IE의 BUG 때문입니다.

어떤 마법 같은 이유로 IE에서 eval을 호출하여 함수를 동적으로 생성하려는 경우 함수 표현식 주위에 괄호만 추가하면 됩니다. 예:

코드 복사 코드는 다음과 같습니다.

eval('(function(){ /* code here */ })' );


은 여전히 ​​정의되지 않은 값을 반환하지만 다른 브라우저에서는 새로 구성된 이 함수에 대한 참조를 올바르게 반환합니다.
약간의 탐색 끝에 문제를 해결하는 가장 간단하고 효과적인 방법은 앞에 "0"을 추가하여 모든(또는 적어도 현재 주요 5개) 브라우저에서 사용할 수 있다는 것을 알았습니다. 예상한 결과를 얻었습니다.
코드 복사 코드는 다음과 같습니다.

eval('0,function(){ /* code here */ }');

참고: 이 문제는 IE9의 Chakra 엔진에서 해결되었습니다~

3. 새로운 배열을 생성하는 배열 객체입니다.

진지하게 말하면 이는 JavaScript의 상식이어야 합니다. 결국 이 메서드의 사용법은 모든 JavaScript 언어 함수 참조에서 찾을 수 있습니다.
그러나 일부 학생들은 언제 사용해야 하는지 기억하지 못할 수도 있습니다.
내 (유사) Lambda 모듈에서 지루해서 여러 별칭을 사용하여 동시에 여러 객체에 참조/값을 연결할 수 있는 함수를 작성했습니다. 이 함수는 객체를 매개변수로 받아들일 수도 있습니다. 일련의 객체를 매개변수로 포함하는 배열입니다.
이 함수는 자주 호출되지 않기 때문에 두 가지 상황에 적응하기 위해 (가장 효율적인 것은 아니지만) 간단하고 효과적인 방법을 사용하기로 결정했습니다. 즉, 단일 객체 매개변수를 하나만 포함하는 배열로 변환하는 것입니다. 이를 다시 처리하기 위해 "[].concat(o)" 형식을 사용하기로 결정했습니다.
내 코드를 읽어보면 주석에 "if (!(o instanceof Array)) o = [o]"라는 또 다른 방법이 포함되어 있다는 것을 알 수 있습니다. 나중에 생각해보니 다음과 같은 느낌이 들었습니다. 첫째로 충분히 엄격하지 않았고(ECMAScript 5의 isArray와 비교하여), 둘째로 호출 횟수가 상대적으로 적고 성능 향상도 매우 제한적이어서 전자를 선택했습니다.
이 글을 읽고 계신 분들, 모두와 공유하고 싶은 흥미로운 기술이 있나요?
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.