0
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就像在调用它之前绑定范围一样。

4

3 回答 3

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);
}();

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

于 2012-06-14T02:07:56.653 回答
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.
于 2012-06-14T02:04:47.637 回答
0

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

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

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

k();
​
于 2012-06-14T02:15:10.780 回答