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

strict モードでは数値を取得しますが、非厳密モードでは Number をオブジェクト ラッパーとして取得します。

于 2012-06-14T02:07:56.653 に答える
0

本当に?何を試しましたか?

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

なぜundefinedあなたの2番目の例でそれがあなたに与えられるのは、bが定義されていないからです。variable を使用する前に、最初に定義する必要があります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 に答える