3

私は Javascript とプログラミング全般に不慣れで、Javascript Enlightenment (p.88)という本からこのコード ブロックにたどり着きました。

var parentFunction = function() {
    var foo = 'foo';
    return function() { // anonymous function being returned
        console.log(foo); // logs 'foo'
    }
}
// nestedFunction refers to the nested function returned from parentFunction

var nestedFunction = parentFunction();

nestedFunction(); /* logs foo because the returned function accesses foo
via the scope chain */

設定var nestedFunction = parentFunction();によりnestedFunction();、ネストされた匿名関数を呼び出して「foo」をコンソールに記録できるのに、parentFunction();何もログに記録しないのはなぜですか?

4

6 に答える 6

4

呼び出すと、無名関数は呼び出されずにparentFunction返されます。

nestedFunctionparentFunction無名関数の戻り値として設定されます。

nestedFunctionしたがって、呼び出すと無名関数が呼び出されます。

匿名関数は使用するconsole.logので、ご覧のとおりです"foo"

于 2013-06-28T00:06:16.567 に答える
3

基本的にあなたがやっている:

parentFunction()(); // double parenthesis

括弧は、値を返す関数を実行することを意味します。その値が a のfunction場合は、それを実行できます。

一度だけ呼び出すと、関数を取得するだけなので、何もconsole.log起こりません

于 2013-06-28T00:05:14.420 に答える
1

あなたのコードに代わるものはこれです

var parentFunction = function() {
  var foo = "foo";
  return console.log.bind(console);
}

parentFunction()();
// => "foo"

必然的に、ある時点でスコープで何かをしたくなるので、次のようにします

var parentFunction = function() {
  this.foo = "foo";
  this.something = function(){
    console.log(this.foo);
  }
  return this.something.bind(this);
}

parentFunction()();
// => "foo"
于 2013-06-28T00:28:11.367 に答える
1
function add (x) {
    return function (y) {
        return x + y;
    };
}
var add5 = add(5);
 add5(3);

説明:

add 関数が呼び出されると、関数が返されます。その関数はコンテキストを閉じ、正確にその時点でのパラメーター x が何であったか (つまり、上記のコードでは 5) を覚えています。作成した。上記の add5 変数は、送信される値に常に値 5 を加算する関数を参照します。つまり、add5 が値 3 で呼び出されると、5 と 3 が加算されて返されます。

このリンクを参照してください...

http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

于 2014-08-19T12:33:27.353 に答える
0

そのコードを次のように書き換えます。

var nestedFunction = null;

var parentFunction = function() {
    var foo = 'foo';
    nestedFunction = function() { // anonymous function being returned
        console.log(foo); // logs 'foo'
    }
}

parentFunction(); 
// outputs nothing
// but initializes nestedFunction by its local function

nestedFunction(); /* logs foo because that local function has access to local 'foo' of
the parent function */

ご覧のとおり、親関数は何も出力しませんが、関数参照によってnestedFunction変数を初期化します。そして、その関数参照は、他の関数として呼び出すことができます。

于 2013-06-28T00:21:28.433 に答える
0

ネストされた関数を返すためparentFunction、実行するために呼び出す必要があります。

var a = nestedFunction;

これを行うまで、実行されていないため、何もログに記録しません。

a();
于 2013-06-28T00:06:22.407 に答える