2014-04-12 2 views
0

에 액세스 나는 내가 무엇을 시도하고있어 폐쇄 및 부모 범위에 관해서 자바 스크립트 가능 여부에 대한 질문이 있습니다.자바 스크립트 함수 클로저와 부모 범위

var func1 = function() { 
    // console.log(this.source1); // wont work, makes sense 
    // console.log(source1);  // wont work, wish it would 
    console.log(this.source2);  // works fine 
    console.log(source2);   // works fine 
}; 
var func2 = function() { 
    var source1 = "source1"; 
    this.source2 = "source2"; 
    func1.call(this); 
}(); 
var func3 = function() { 
    var source3 = "source3"; 
    var func4 = function() { 
     console.log(source3); // also works fine, makes sense 
    }(); 
}(); 

내가 FUNC1 내부 FUNC2에 VAR로 선언 된 변수에 대한 액세스 권한을 얻을 수있는 방법 있나요, 아니면 운 이니 여기 내 코드는?

+0

아니요 ............ – thefourtheye

답변

1

다른 사람들이 말한 것처럼 - 아니요.

하지만 당신은 래퍼에서이 모든 일을 놓고, 다음을 수행 할 수 있습니다 밝히려 모듈 패턴을 사용하는 경우.

var module = (function() { 
    var source1; 
    var source2; 

    var func1 = function() { 
     console.log(source2);   // works fine 
    }; 
    var func2 = function() { 
     source1 = "source1"; 
    }(); 
    var func3 = function() { 
     var func4 = function() { 
      console.log(source1); // also works fine, makes sense 
     }(); 
    }(); 

    return { 
     func1: func1, 
     func2: func2, 
     func3: func3 
    }; 

}()); 

// Then invoke them. 
module.func2(); 
module.func1(); 

편집 그런 다음 원래 이름으로 다시 재 할당 할 수 있습니다.

var func1 = module.func1; 
var func2 = module.func2; 
var func3 = module.func3; 
+0

의미가 있습니다. 불행히도, 나는 그런 종류의 재 작업을 할 수 없습니다. 화살표 기능이 ECMAScript 6에서 사용 가능할 때까지 기다리는 것에 대한 핑계가됩니다. 실제 문제를 해결할 것입니다. – dvlsg

+0

@dvlsg - 편집을 참조하십시오. –

1

귀하의 질문에 대한 답변은 아니오입니다.

내부 함수 범위

자체 범위와 내부 기능 선언 된 외부 기능 (없다라고 선언하지만)의 범위로 제한된다.

console.log(this.source2); 두 함수의 문맥이 (창 외부 함수의 역할을) window 있습니다. 해당 기능 내에 this = window이 있습니다.

1

글쎄, 그렇지 않아도 작동하지 않을 것입니다. 고맙게도 :) 그것은 정확하게 지역 변수가 어떻게 행동해야하는지입니다. 당신이 할 수있는

한 가지 기능 FUNC1에 원하는 변수를 전달한다 (그리고 함수를 기대한다 아무 문제가없는 -. 당신이 어딘가에하고자하는 변수를 통과하지 않고이 함수를 호출하는 경우, 자바 스크립트는 완전히 것 그것도 괜찮음)

또 다른 한가지는 "var"키워드없이 소스 1 변수를 선언하는 것입니다. 그렇다면 제대로 작동 할 것입니다.하지만 글로벌 변수를 잘 관리하지 않는 한 그렇게해서는 안됩니다.

관련 문제