나는 JavaScript Quiz-Legend를 설명하는이 기사를 발견했습니다. 어쨌든 괜찮아요
질문 1
(function () {return typeof arguments; // "object"}) ();인수는 배열과 같은 객체로 전달 된 함수의 매개 변수 목록에 해당합니다. 이 변수를 모든 기능에서 직접 사용할 수 있습니다.
연산자 유형은 유형 문자열의 결과 만 반환합니다. Typeof가 반환 한 값이 해당 다른 데이터인지 확인하려면 다음 목록을 참조하십시오.
이것으로부터 우리는 유형의 인수가 객체임을 추론합니다
질문 2
var f = function g () {return 23; }; typeof g (); // 오류를보고합니다이것은 이름 g의 함수 표현식이며 변수 f에 할당됩니다.
기능 이름 g 및 여기에 할당 된 변수 f는 다음과 같은 차이점이 있습니다.
함수 이름 g는 변경할 수없고 변수 f를 재 할 수 있습니다.
함수 이름 G는 기능 본문 내에서만 사용할 수 있습니다. 함수 외부에서 G를 사용하려고하면 오류 가보고됩니다.
질문 3
(함수 (x) {delete x; return x; // 1}) (1);삭제 연산자는 객체에서 속성을 삭제할 수 있으며 올바른 사용법은 다음과 같습니다.
객체를 삭제합니다
객체 삭제 [ 'property']
삭제 연산자는 객체의 속성에만 사용할 수 있으며 변수 및 기능 이름에 대해 유효하지 않습니다. 즉, x 삭제는 의미가 없습니다.
삭제가 메모리를 직접 해제하지 않으면 객체 참조를 간접적으로 방해하는 것을 알 수 있습니다.
질문 4
var y = 1, x = y = typeof x; x; // "정의되지 않은"
위의 코드를 다음 두 단계로 분류하려고합니다.
var y = 1; // 1 단계
var x = y = typeof x; // 2 단계
첫 번째 단계에 대한 반대 의견이 없어야합니다. 두 번째 단계를 직접 살펴 보겠습니다.
1. 과제 표현은 오른쪽에서 왼쪽으로 실행됩니다
2. y 유형 X에 재 할당 된 결과, 즉 정의되지 않은 결과
3.x는 올바른 표현식 (y = typeof x)의 결과로 할당됩니다.
질문 5
(함수 f (f) {return typeof f (); // "number"}) (function () {return 1;});직접 의견 설명 :
(function f (f) {// 여기서 f는 function () {return 1;}에 전달 된 매개 변수입니다. 실행 결과는 자연스럽게 1 return typeof f ()입니다. 따라서 질문 1의 테이블에 따르면, 1 유형이 "number"}) (function () {return 1;});질문 6
var foo = {bar : function () {return this.baz; }, baz : 1}; (function () {return typeof arguments [0] (); // "undefined"}) (foo.bar);여기서 당신은 실수로 최종 결과가 숫자라고 생각할 수 있습니다. 매개 변수를 함수로 전달하는 것은 할당으로 간주 될 수 있으므로 [0]는 foo.bar에 대한 참조보다는 실제 막대 함수의 값을 가져 오므로 당연히 FOO가 아니라 창을 가리킬 수 있습니다.
질문 7
var foo = {bar : function () {return this.baz; }, baz : 1} typeof (f = foo.bar) (); // "undefined"이것은 이전 질문과 같은 문제입니다. (f = foo.bar) 참조가 아니라 막대의 값을 반환하므로 FOO를 가리키지 않습니다.
질문 8
var f = (함수 f () {return '1';}, function g () {return 2;}) (); typeof f; // "숫자"쉼표 연산자는 각 조작 객체 (왼쪽에서 오른쪽으로)를 평가하고 마지막 작업 객체의 값을 반환합니다.
따라서 (함수 f () {return '1';}, function g () {return 2;})의 반환 값은 function g이고 실행 한 다음 결과는 2입니다. 결국 2 타입, 질문 1의 테이블에 따르면 결과는 자연스럽게 숫자입니다.
질문 9
var x = 1; if (function f () {}) {x += typeof f;} x; // "1undefined"이 문제의 핵심 요점은 질문 2에서 언급했으며, 함수 표현식의 함수 이름 F는 함수 본문 외부에서 액세스 할 수 없습니다.
질문 10
var x = [typeof x, typeof y] [1]; typeof x; // "string"1. 변수 y가 선언되지 않았기 때문에 y 유형은 "정의되지 않은"을 반환합니다.
2. y 유형의 결과를 x에 할당합니다. 즉, x는 이제 "정의되지 않은"입니다.
3. 그런 다음 X 형은 물론 "String"입니다.
4. "String"유형의 최종 결과는 자연스럽게 여전히 "String"입니다.
질문 11
(function (foo) {return typeof foo.bar; // "undefined"}) ({foo : {bar : 1}});이것은 순수한 시각적 트릭입니다
(function (foo) {// 여기서 foo는 {foo : {bar : 1}}이며, 막대 속성이 없습니다. // bar 속성은 foo.foo///so 아래에 있습니다. 여기서 결과는 "정의되지 않은"return typeof foo.bar;}) ({foo : {bar : 1});질문 12
(함수 f () {function f () {return 1;} return f (); // 2 function f () {return 2;}}) ();함수 선언을 통해 선언 된 기능은 선언 전에 사용될 수 있으며,이 기능은이 기능을 들어 올릴 수 있습니다. 따라서 위의 코드는 실제로 다음과 같은 실행중인 환경에서 설명합니다.
(함수 f () {function f () {return 1;} 함수 f () {return 2;} return f ();}) ();질문 13
함수 f () {return f; } 새로운 f () 인스턴스 F; // false코드 new f ()가 실행되면 다음이 발생합니다.
1. 새 객체가 생성됩니다. F. prototype에서 상속됩니다
2. 생성자 F가 실행됩니다. 실행 중에 해당 패스가 전달되며 컨텍스트 (this)는이 새 인스턴스로 지정됩니다. 새로운 F는 새로운 f ()와 동일하며 매개 변수가 전달되지 않은 경우에만 사용할 수 있습니다.
3. 생성자가 "객체"를 반환하면이 객체는 완전히 새로운 결과를 대체합니다. 생성자가 객체를 반환하지 않으면 새로운 결과는 1 단계에서 생성 된 객체입니다.
PS : 정상적인 상황에서 생성자는 값을 반환하지 않지만 사용자 가이 반환 값을 덮어 쓰고 자하는 경우 일반 객체를 반환하여 덮어 쓰기를 선택할 수 있습니다. 물론 배열도 개체이기 때문에 반환 배열도 덮어 쓸 것입니다.
따라서, 우리가 여기에있는 새로운 f ()는 여전히 인스턴스가 아니라 함수 자체를 반환합니다.
질문 14
(함수 (x, undefined) {}) 길이; // 2
with 문은 스코프 체인의 상단에 객체를 추가합니다. 스코프 체인의 속성과 동일한 이름을 가진 명령문에 네임 스페이스를 사용하지 않은 변수가있는 경우 변수는 속성 값을 가리 킵니다. 동일한 이름의 속성이있는 경우 참조 오류 예외가 발행됩니다.
OK, 이제 함수 (x, undefined) {}는 익명 함수 표현식이며 함수이므로 길이 속성을 가지며 함수의 매개 변수 수를 나타냅니다. 따라서 최종 결과는 2입니다
마지막에 작성되었습니다
어떤 사람들은 이러한 질문이 까다 롭다고 생각하는 반면, 다른 사람들은 자신의 지평을 넓히고 자신의 의견에 달려 있다고 생각합니다. 그러나 한 가지는 사실입니다. 당신이 확고한 실무자이든 아니든, 당신은 분명히 이론적 기초없이 멀리 가지 않을 것입니다. 당신은 숙련 된 기술 직원이 갑자기 로켓 전문가가되는 것을 보지 못할 것입니다.
문서 읽기, 표준 읽기 및 연습을 결합하는 것은 동지들에게 결정적인 방법입니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.