1 : 범위 범위
코드 사본은 다음과 같습니다.
(기능() {
var a = b = 5;
}) ();
Console.log (b);
콘솔에 무엇이 인쇄됩니까?
답변
위의 코드는 5를 인쇄합니다.
이 문제의 속임수는 여기에는 두 가지 변수 선언이 있지만 키워드 Var. 함수의 로컬 변수임을 나타냅니다. 대조적으로, B는 글로벌 변수가된다.
이 문제의 또 다른 요령은 엄격한 모드를 사용하지 않는다는 것입니다 ( 'Strict';). 엄격한 모드가 활성화되면 코드는 참조 오류 오류를 일으 킵니다. B는 정의되지 않습니다. 엄격한 모드를 기억하십시오. 글로벌 변수 선언을 구현하려면 명시 적으로 지정해야합니다. 예를 들어 다음을 작성해야합니다.
코드 사본은 다음과 같습니다.
(기능() {
'엄격한 사용';
var a = Window.b = 5;
}) ();
Console.log (b);
2 : "기본"메소드를 만듭니다
문자열 객체의 반복 함수를 정의하십시오. 정수 n이 통과되면 문자열의 결과를 반복 N 번 반환합니다. 예를 들어:
코드 사본은 다음과 같습니다.
Console.log ( 'hello'. Repeatify (3));
Hello Hellohello를 인쇄해야합니다.
답변
가능한 구현은 다음과 같습니다.
코드 사본은 다음과 같습니다.
String.prototype.repeatify = string.prototype.repeatify || 기능 (시간) {
var str = '';
for (var i = 0; i <times; i ++) {
str += 이것;
}
Return str;
};
현재 문제는 JavaScript 상속 및 프로토 타입에 대한 개발자의 지식을 테스트합니다. 이것은 또한 개발자가 내장 객체가 확장되었는지 여부를 확인합니다 (이는 수행하지 않아야하지만).
여기서 또 다른 요점은 정의 된 기능을 무시하지 않는 방법을 알아야한다는 것입니다. 테스트 기능 정의는 전에 존재하지 않습니다.
코드 사본은 다음과 같습니다.
String.prototype.repeatify = string.prototype.repeatify || 함수 (시간) {/ * Code here */};
이 기술은 JavaScript 기능과 호환되도록 요청받을 때 특히 유용합니다.
3 : 프로모션 선언 (Hoisting)
이 코드를 실행하고 결과를 출력하십시오.
코드 사본은 다음과 같습니다.
기능 test () {
Console.log (a);
Console.log (foo ());
var a = 1;
함수 foo () {
반환 2;
}
}
10 : test ();
답변
이 코드의 결과는 정의되지 않았으며 2.
그 이유는 변수와 함수 선언이 모두 고급 (함수의 상단으로 이동)이지만 변수는 값을 할당하지 않기 때문입니다. 따라서 변수를 인쇄 할 때는 함수에 존재하지만 (선언되어 있음) 여전히 정의되지 않았습니다. 다시 말해 위의 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
기능 test () {
var a;
함수 foo () {
반환 2;
}
Console.log (a);
Console.log (foo ());
a = 1;
}
시험();
4 : 이것이 JavaScript에서 어떻게 작동하는지
다음 코드는 어떤 결과를 출력합니까? 당신의 대답을주세요.
코드 사본은 다음과 같습니다.
var fullname = 'John Doe';
var obj = {
풀 이름 : 'Colin Ihrig',
소품 : {
풀 이름 : 'Aurelio de Rosa',
getfullname : function () {
이 is.fullname;
}
}
};
console.log (obj.prop.getfullname ());
var test = obj.prop.getfullname;
Console.log (test ());
답변
답은 Aurelio de Rosa와 John Doe입니다. 그 이유는 함수에서 이것의 동작이 JavaScript 함수가 어떻게 정의되는지가 아니라 JavaScript 함수를 호출하고 정의하는 방법에 달려 있기 때문입니다.
첫 번째 console.log () 호출에서 getfullname ()는 obj.prop 객체의 함수로 호출됩니다. 따라서 컨텍스트는 후자를 말하고 함수는 객체의 풀 이름을 반환합니다. 대조적으로, getfullname ()이 테스트 변수에 할당되면 컨텍스트는 글로벌 오브젝트 (창)을 나타냅니다. 테스트는 암시 적으로 글로벌 객체로 설정된 속성이기 때문입니다. 이러한 이유로 함수는 창의 풀 이름, 즉 첫 번째 줄에 정의 된 값을 반환합니다.
5 : Call () 및 apply ()
이제 이전 문제를 해결하고 마지막 콘솔을 만들 수 있습니다. log () Aurelio de Rosa를 인쇄하십시오.
답변
문제는 call () 또는 apply ()를 강요하여 함수 컨텍스트를 변경할 수 있습니다. 아래에서 콜 ()을 사용하지만이 경우 apply ()는 동일한 결과를 출력합니다.
코드 사본은 다음과 같습니다.
console.log (test.call (obj.prop));