2012-05-10 5 views
3

를 JSLint '가 정의되기 전에 함수가 사용 된'원인 :의 네임 패턴은 나는 다음과 같은 네임 스페이스 지정 패턴을 사용하고 오류

var MyNamespace = new function() { 
    var foo = function() { 
     bar(); 
    }; 
    var bar = function() { 
     alert("bar"); 
    }; 
    this.init = function() { 
     foo(); 
    }; 
}; 

$(document).ready(function() { 
    MyNamespace.init(); 
}); 

JSLint가 정의되기 전에 bar 사용하는 것이 뿌려줍니다. 그러나 foobar 이후에야 호출됩니다. 코드는 내가 시도한 모든 브라우저에서 잘 작동합니다. http://jsfiddle.net/jDKvz/

패턴은 How do I declare a namespace in JavaScript?, 두 번째 대답입니다.

여기에서 뭔가를 수정해야합니까, 아니면 JSLint를 무시해야합니까?

+0

아마도 두 함수의 순서를 바꾸면 JSLint는 만족 스러울 것입니다. 그러나 "필요하다"는 것이 주관적인지 여부입니다. 모든 것에 대해 JSLint에 동의하지는 않지만,이 경우에는 코드를 변경하여 코드를 닫을 수 있습니다. – nnnnnn

+0

@nnnnnn 제 실제 프로젝트는 훨씬 더 복잡하며, 예를 들어 서로를 호출하는 함수를 포함 할 수도 있습니다. – Flash

+0

이 경우 나는이 시점에서 JSLint를 무시하게되어 매우 기쁩니다. 'var foo = function() ...'대신에'function foo() ...'구문을 사용하여 어떤 차이가 있는지 확인해 볼 수는 있지만, 어떤 종류의 경고/오류를 기억해야하는지 고민해야하기 때문에 실제로 걱정할 ... – nnnnnn

답변

1

나는이 게양되어 있기 때문에 리프팅, 변수와 함수 선언의 용의자 통역사가 맨 위에 표시하면 다음과 같이 표시됩니다.

var MyNamespace = new function() { 
    var foo; 
    var bar; 

    foo = function() { 
     bar(); 
    }; 

    bar = function() { 
     alert("bar"); 
    }; 

    this.init = function() { 
     foo(); 
    }; 
}; 

이제안에bar()은 아직 구문 분석되지 않았으므로 해당 지점에서 호출 할 수있는 함수가 아닌 bar 변수 일뿐입니다.

당신의 코드가 잘 작동한다면, 함께 가서 strict mode을 켜면 도움이된다는 말입니다.

0

편집 : 생각 JS는 값이 아닌 변수를 닫습니다.

가변 호이닝이 보이지 않아 JSLint가 불평합니다. 다른 함수가 사용하는 함수 앞에 다른 함수가 사용하는 함수를 정의하면됩니다. 그것은 당신의 코드를보다 읽기 쉽게 만들어주고 JSLint를 종료시킵니다. 예를 들어

:

var MyNamespace = new function() { 
    var bar = function() { 
     alert("bar"); 
    }; 

    var foo = function() { 
     bar(); 
    }; 

    this.init = function() { 
     foo(); 
    }; 
}; 
+0

제 코드도 작동합니다. 문제의 바이올린을보십시오. – Flash

+0

"폐쇄 규칙"? 다시 생각 해봐. _ "값이 정의되지 않은 값으로 닫힙니다."_ _ 클로저가 _variables_를 닫고 _values_는 닫히지 않습니다. 이 질문에 표시된 코드는'bar'가'foo()'가 호출 될 때 정의되기 때문에 작동합니다. 함수를 반대로하면 JSLint가 닫혀 야하지만 원래의 방법은 실제로 잘못이 아닙니다. – nnnnnn

+0

좋아요, 틀린 closure 물건에 대한 가독성에 대한 대답이 변경되었습니다. 나는 누군가에게 함수 선언문을 사용하라고 말하지 않을 것이다. – Havvy

0

bar는 함수 표현보다는이 할당되는 것 후에 만 ​​작동합니다 의미 함수 선언이다. 대신에 함수 선언을 사용할 수 있으며 jslint는 더 이상 불평하지 않습니다.

function bar() { 
    ... 
} 

또한 new Functionfunction 충분 불필요하다.

편집 :

이 경우 자동 호출 기능 (function(){}()) 또는 객체 리터럴을 사용 new 제거에처럼 보인다 {}

+0

'new' *는 여기에 필요합니다 – KooiInc

+0

이유는 무엇입니까? – elclanrs

+1

다음 함수를 생성자로 호출합니다. – Havvy