3

ここでは JavaScript の初心者です。私はこの次のコードを持っています:

function testObject(elem) {
    this.test = "hi";
    this.val = elem;
    console.log(this.test+this.val);
    echo();

    function echo () {
        console.log(this.test+this.val);
    }
}

var obj = new testObject("hello");

実行すると、コンソールに「hihello」が2回出力されると思います。代わりに、最初は期待どおりに出力されますが、2 回目は NaN が返されます。

私はここで何かが欠けていると確信しています。内部関数は外部に保持されている変数にアクセスできると思いました。誰かが私を案内してもらえますか?私はどちらかというと機能的な UI 開発者であり、OO コードの経験はあまりありません。

ありがとう!

4

3 に答える 3

4

問題は、内部echothis値がグローバル オブジェクトを指しており、 this.testand this.val(これは and を参照しwindow.testているwindow.val) であるということundefinedです。

this次のように呼び出して、echoの値を設定できます。

echo.call(this);

これは、によって関数を呼び出していたために発生しecho();this値は暗黙的にグローバル オブジェクトに設定されます。

値がどのように機能するかについては、この質問をご覧くださいthis

編集:呼び出すことができるようにするには、外部関数コンテキストから値をecho();保持する必要があります。たとえば、次のようthisに、多くの方法があります。

//...
var instance = this; // save the outer `this` value
function echo (){
  console.log(instance.test+instance.val); // use it
}
echo();
//...

または

//...
var echo = (function (instance) {
  return function () {
    console.log(instance.test+instance.val);
  };
})(this); // pass the outer `this` value
echo();
//...
于 2010-08-03T20:11:35.940 に答える
3

これを行うこともできます:

function testObject(elem) {
    this.test = "hi";
    this.val = elem;
    console.log(this.test+this.val);

    this.echo = function () {
        console.log(this.test+this.val);
    }
    this.echo();
}

var obj = new testObject("hello");

this.echo()またはobj.echo()を呼び出すたびにthis、関数を呼び出すオブジェクトにバインドされます。

于 2010-08-03T20:14:21.440 に答える
1

個人的には、次のようにクラス メソッドを宣言するのはエレガントだと思います。

function testObject(elem) {
    this.test = "hi";
    this.val = elem;
    this.echo();
}

testObject.prototype = {
    echo: function () {
        console.log(this.test + this.val);
    }
}

var obj = new testObject("hello");
于 2010-08-03T23:21:54.660 に答える