1. 함수 선언
function foo(){
//code
}
JS에서는 함수도 객체이고, 함수 객체는 Function.prototype에 연결됩니다(Function.prototype은 Object.prototype에 연결됩니다)
2. 함수 리터럴 Formula
var foo = function foo(){
//code
}
객체에는 프로토타입 객체에 대한 숨겨진 연결이 있습니다. 객체 리터럴에 의해 생성된 객체는 Object.prototype에 연결됩니다. foo.__proto__ == Function.prototype
3. New 생성자를 사용하여
new 함수([arg1[, arg2[, ... argN]],] functionBody)를 생성합니다. 🎜>실행될 때마다 새로운 함수 생성
이 세 가지 모드를 소개하는 온라인 자료가 많이 있습니다. 처음 두 모드는 동일한 어휘 범위를 기반으로 거의 동일합니다.
어휘 범위: 변수의 범위는 실행될 때가 아니라 정의될 때 결정됩니다. 즉, 어휘 범위는 소스 코드에 따라 달라지므로 정적 분석을 통해 결정할 수 있습니다. 어휘 범위는 정적 범위라고도 합니다. with와 eval을 제외하면 JS의 범위 메커니즘은 어휘 범위(Lexical Scope)에 매우 가깝다고 할 수 있습니다.
갑자기 주제에서 벗어난 것 같습니다. 이 기사는 실제로 eval과 New Function의 차이점을 기록하고 있습니다. 주제로 돌아가 보겠습니다.
어떤 사람들은 new Function 메서드가 거의 같다고 말했습니다. eval.. 오늘 확인해 보니 정말 뭔가 다르다는 걸 깨달았습니다. 이 말을 한 사람은 정말 무책임한 사람이었습니다. eval 및 new 기능과 관련하여 얻은 결과는 동일하므로 사용하지 말라고 합니다. 그래서 결론은 "필요하다면" 사용하는 것입니다.
eval()은 현재 실행 범위 내에서 문자열을 JavaScript 표현식으로 평가하고 로컬 변수에 액세스할 수 있습니다.
new Function()은 문자열에 저장된 JavaScript 코드를 함수 객체로 구문 분석합니다. 코드가 별도의 범위에서 실행되기 때문에 로컬 변수에 접근할 수 없습니다.
위의 2가지 점을 보면 eval의 범위는 현재 범위이고, new 함수는 동적으로 생성되며 해당 범위를 알 수 있습니다. 항상 그들은 모두 창문입니다. 게다가 eval은 지역 변수를 읽을 수 있지만 new Function은 읽을 수 없습니다.
function test() {
var a = 11 ;
eval('(a = 22)'); //new Function('return (a = 22);')();
alert(a); // 경고 22
}
따라서 일반적으로 eval은 JSON 개체를 변환하는 데만 사용되며 new Function에도 특별한 용도가 있지만 다음과 같은 경우에는 여전히 사용됩니다. 덜 사용하는 것이 좋습니다.
추가 정보: 사악한 평가 및 새로운 기능
여기에 백업하십시오:
코드:
// 주의 사항: 손가락의 안전을 위해
'alert("hello")'를 실행하세요. Chrome에서 .replace(/. /, eval)
'alert("hello")'.replace(/./, function(m){new Function(m)();}); 🎜> var i = 0; eval(new Array(101).join('alert( i);'))
var i = 0; new Function(new Array(101).join('alert( i );'))();