(1,eval)
오래된 것과 평범한 차이점 eval
은 전자는 값 이고 후자는 lvalue라는 것입니다. 다른 식별자라면 더 분명 할 것입니다.
var x;
x = 1;
(1, x) = 1;
그것은 (말 하거나 할 것 같은) (1,eval)
양보하는 표현 이지만 .eval
(true && eval)
(0 ? 0 : eval)
eval
왜 신경 쓰나요?
Ecma 사양은 참조 를 eval
"직접 평가 호출" 이라고 간주 하지만 단순히 eval
간접 평가 호출이 되는 표현식 이며 간접 평가 호출은 전역 범위에서 실행되도록 보장됩니다.
내가 아직 모르는 것 :
- 직접 평가 호출 이 전역 범위에서 실행 되지 않는 상황은 무엇 입니까?
- 어떤 상황
this
에서 전역 범위의 함수 가 전역 객체를 생성 하지 못할 수 있습니까?
여기에서 더 많은 정보를 얻을 수 있습니다 .
편집하다
내 첫 번째 질문에 대한 대답은 "거의 항상"입니다. 현재 범위 eval
에서 직접 실행됩니다 . 다음 코드를 고려하십시오.
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
당연히 (heh-heh) 다음과 같이 출력됩니다.
direct call: inner
indirect call: outer
편집하다
더 많은 실험을 마친 후에 this
는 null
또는 로 설정할 수 없다고 잠정적으로 말할 것입니다 undefined
. 다른 잘못된 값 (0, '', NaN, false)으로 설정할 수 있지만 매우 고의적으로 만 설정할 수 있습니다 .
나는 당신의 소스가 경미하고 가역적 인 두개-직장 반전으로 고통 받고 있으며 Haskell에서 일주일 동안 프로그래밍하는 것을 고려하고 싶을 것입니다.