2017-12-09 4 views
0

javasciptでのスコーピングに関する問題があります。私は "new"キーワードを使って問題なく新しいオブジェクトを作成しようとしました。コードはこのJavascript:新しいキーワードコンストラクタを使用した字句スコープの問題

"use strict"; 

function Person() { 
    this.name = "john doe"; 
    console.log(this.name); 
} 

Var foo = new Person() 

のように見える私は名前の変数のスコープは、内部機能

"use strict"; 

function Person() { 
     this.name = "john doe"; 

     Function speak() { 
        console.log("my name is" + this.name); 
     } 

     speak(); 
    } 

    var foo = new Person(); 

//error: "cannot read property 'name' of undefined" 

内不定となり、内部機能を追加しようとしたとき、私は遭遇した問題がある誰かがあると思われるものを説明することはできます問題?みんな

厳格モード
+0

重複質問のように見える:https://stackoverflow.com/questions/762011/whats-the-difference-between-using-let-and-var-to-declare -a-variable – RetroCoder

+0

w3schoolsでも:https://www.w3schools.com/js/js_strict.asp – RetroCoder

+0

[JavaScriptで「厳密に使用する」とは何か、その背後にある推論は何ですか?](https ://stackoverflow.com/questions/1335851/what-does-use-strict-do-in-javascript-and-what-is-the-reasoning-behind-it) – RetroCoder

答えて

1

あなたはnew Person()を持つオブジェクトを作成している、thispropertynameと呼ばれていないwindowオブジェクトを参照していただきありがとうございます。 nameと呼ばれるpropertyPersonオブジェクトに属します。 エラーcannot read property 'name' of undefinedが表示されます。

ユーザーPersonの値を保持する別の変数は、内部関数内の値を使用するためにオブジェクトのthisを使用します。

var thatObj = this;

"use strict"; 
 

 
function Person() { 
 
    this.name = "john doe"; 
 
    var thatObj = this; 
 
    function speak() { 
 
    console.log("my name is: " + thatObj.name); 
 
    } 
 

 
    speak(); 
 
} 
 

 
var foo = new Person();

+0

これはなぜ定義されていないのですか?ありがとう –

+0

@arnoldemzi、私は理由を追加しました。どうぞご覧ください...ありがとうございます。 – Mamun

+0

あなたは "use strict"について言及する必要がありますが、問題を解決するためにupvotedしました。 –

0

またspeakthisと同じスコープを与えることができます。これは公開機能にもなりますので、クラスの外からspeakを呼び出すことができます。

function Person() { 
 
    this.name = "john doe"; 
 

 
    this.speak = function() { 
 
     console.log("my name is " + this.name); 
 
    }; 
 
      
 
    this.speak(); 
 
} 
 

 
var foo = new Person();

+0

このコードはうまく動作します。しかし、これを追加することで、それを内部関数にすることはできません。anymoteは人オブジェクトの関数になります。 –

+0

@arnoldemziもう一つの選択肢は、 'speak();'から 'speak.call(this) ; ' – Paulpro

関連する問題