2012-03-19 2 views
7

나는 정말로 좋은 JavaScript 사용자는 아니지만 그 일을 처리 할 수는있다. 자바 스크립트로 작성한 코드가 자랑스럽지 않으므로이를 변경하기로 결정했습니다. 여기 내 첫 번째 단계입니다 :JavaScript에서 유효 범위를 지정하는 방법

프로젝트에 대한 내 자신의 라이브러리를 만들려고 노력하고 있으며, 아래는 초기 구조입니다.

window.fooLib = {}; 

(function (foo) { 
    "use strict"; 

    foo.doSomeStuff = function(param1) { 

     console.log(new AccommProperty(param1)); 
    } 

    //some internal function 
    function AccommProperty(nameValue) { 
     var _self = this; 
     _self.name = nameValue; 
    } 

}(fooLib)); 

나는 나의 변수를 초기화하려면 여기를 즉시 호출 함수 표현식을 사용했다. 이 경우 fooLib입니다.

window.fooLib을 더 안전하게 만들기 위해 다른 일을해야하는지 잘 모르겠습니다. 자바 스크립트를 올바르게 이해하면 내 코드를 따라갈 다른 코드에 의해 재정의 될 수 있습니다.

귀하의 의견은 무엇입니까?

+0

"use strict"를 사용하십시오. 당신을 보호하고, 당신이 할 수있는 모든 것입니다. – Christoph

+0

@Christoph 나는 위에서 보았 듯이 위의''strict strict; ''를 사용했습니다. 이것이 올바른 사용법인가요? – tugberk

+2

예. [john resig의 기사를보십시오] (http://ejohn.org/blog/ecmascript-5-objects-and-properties/) 어떻게 보호를 얻을 수 있는지, https : // developer의'Object.freeze (obj)' .mozilla.org/ko/JavaScript/Reference/Global_Objects/Object/freeze – Christoph

답변

1

변수를 덮어 쓰지 않으려면 Object.defineProperty()을 쓰기 가능 : false, 구성 가능 : false로 사용할 수 있습니다. 귀하의 사례 :

그래도 그럴만한 이유가 없습니다. EcamScript 5.1이 작동해야하고, 주변에 심이 없습니다. = 연산자로 덮어 쓰기를 막기 위해 getter/setters가있는 것입니다.

그러나 또한 라이브러리를 덮어 쓰기 할 필요가 없어야합니다. 단지 lib를 무시하는 코드를 사용하지 마십시오. 또는 다른 사람이 동일한 인터페이스를 사용하여 더 나은 lib로 사용자의 기능을 덮어 쓰고 싶어 할지도 모릅니다.

다른 사용자와 가능한 네임 스페이스 충돌로 인해 공유 할 라이브러리에 관한 질문 인 경우 jQuery.noConflict을 참조하십시오.

0

모든 JavaScript 개체를 재정의 할 수 있습니다. 이것은 자바 스크립트의 본질이며 변경할 수 없습니다. 따라서 코드를 안전하게 만들 수는 없습니다.

자가 침범 된 기능은 로컬 변수를 갖고 싶지만 모든 기능을 수행 할 때 사용해야합니다. 따라서 귀하의 경우 AccommProperty은 그러한 변수입니다. 범위 내에 doSomeStuff을 정의하면 doSomeStuff이 범위 내부에 정의 된 변수를 사용하지 않는 한 차이가 없습니다.

그래서 사용자로부터 변수를 숨기고 싶거나 전역을 필요로하고 이름 충돌에 대해 애 태우는 경우 자체 호출 된 함수를 사용하십시오.

+0

감사합니다! 예제 코드가 변경되었습니다. 이제는 생각보다 이해가됩니다. – tugberk

-1

window.fooLib을 더욱 안전하게 만들기 위해 다른 일을해야하는지 잘 모르겠습니다. 자바 스크립트를 올바르게 이해하면 내 코드를 따라갈 다른 코드에 의해 재정의 될 수 있습니다.

대신 window.fooLib을 로컬 변수로 만들 수 있습니다.

(function() { 

    // all functions nested in foo() have access to fooLib. 
    fooLib = {} 

    fooLib.doSomeStuff = function(param1) { 
     console.log(param1); 
     console.log(fooLib); 
    } 

    //some internal function 
    function AccommProperty() { 
     console.log(fooLib); 
    } 

}()); 

은 자세한 내용은 Javascript Closures: Encapsulating Related Functionality를 참조하십시오 closures and nested functions 하나를 사용하면 전역으로 퍼팅 또는 window 객체에 부착하는 대신 모든 데이터를 넣을 수있는 공간을 에뮬레이션 할 수 있습니다.

+0

괜찮지 만이 경우에는이 IIFE 외부에서'fooLib '을 사용할 수 없으며 라이브러리를 만들고 싶다면별로 의미가 없습니다. 아니면 내가 틀렸어? – tugberk

+0

당신의 fooLib도 윈도우에 첨부되어 있습니다 ... 그리고 외부 액세스를 제공하기 위해서 필요합니다. (라이브러리의 의미입니까?) 당신이 만든 JS의 모든 객체 (ES3)는 작동하지 않으면 무시 될 수 있습니다 ES5로 보호하고 보호하십시오. – Christoph

+0

@tugberk : 라이브러리 상태를 로컬 변수로 유지하는 하나의 함수에 전체 라이브러리를 넣습니다. 모든 라이브러리 함수는 중첩 된 함수가됩니다. –

관련 문제