javascript中的范围访问私有变量

时间:2012-06-14 01:37:38

标签: javascript binding scope

a = function (){
    var b = 10;
    var k = function(){
        console.log(b);
    }();
}();

以上代码将打印10。

var k = function(){
    console.log(b);
}
var a = function (){
    var b = 10;
    k();
}();

此代码将打印 undefined

是否可以打印10?就像在调用范围之前将范围绑定到k一样。

3 个答案:

答案 0 :(得分:1)

当@Derek回答时,你显然可以传递一个论点。

除此之外,您无法转移或更改变量范围,但您可以直接操作调用上下文。

因此,您可以将b设置为对象的属性,并将该对象设置为您正在调用的任何函数的调用上下文。

var k = function(){
    console.log(this.b);
}
var a = function (){
    var obj = {b:10};
    k.call(obj);
}();

.call()方法调用k函数,但将您提供的第一个参数设置为被调用函数的调用上下文。

实际上,从技术上讲,您不需要使用对象。您可以直接将数字设置为要使用的值...

var k = function(){
    console.log(this);
}
var a = function (){
    var b = 10;
    k.call(b);
}();

在严格模式下,您将获得该数字,但在非严格模式下,您将获得Number作为其对象包装器。

答案 1 :(得分:0)

真的?你有什么尝试?

var k = function(b){
    console.log(b);
}
var a = function (){
    var b = 10;
    k(b);  //Done.
}();

为什么在第二个示例中为您提供undefined是因为b未定义。在使用变量b之前,您必须先定义它。

var k = function(b){ //<--There, defined. Mission accomplished.

答案 2 :(得分:0)

可以通过eval授予对范围的访问权限。

var a = (function() {
    var b = 10;
    return {
        eval: function(s) {
            return eval(s);
        }
    };
})();

var k = function() {
    console.log(a.eval("b"));
};

k();
​