-1

私のコード -

<script type="application/javascript">
var firstObject = {
sayHello : function(){
        document.write("My name is "+ this.myName +"<br>");
},
myName : "Swapnesh Sinha"
};
var secondObject = {myName : "Sanjay Sinha"};

document.write("First one " + firstObject.sayHello() );
document.write("<br>");
document.write("Second one "+ secondObject.myName); 
</script>

ソース- http://learn.jquery.com/javascript-101/this-keyword/

予想される出力 -

First one Swapnesh Sinha
Second one Sanjay Sinha

予期しない出力 (私の感覚から)-

My name is Swapnesh Sinha
First one undefined
Second one Sanjay Sinha 

undefinedソースが名前を返すと言及しているのに、それが返される理由を教えてください。または私が間違っている何か

4

3 に答える 3

1

最初のdocument.writeでは、関数を呼び出し、関数の戻り値を文字列 "First one " に連結するように要求します。

document.write関数が評価され、その時点でオブジェクト内の呼び出しを介して「私の名前は Swapnesh Sinha です」が出力されます。ただし、その関数呼び出しは値を返さないため、 でありundefined、「最初の 1 つ」に連結されて出力されます。

于 2013-03-15T17:20:54.010 に答える
0

ここに作業フィドルがあります: JsFIDDLE

ほとんどの jQuery 開発者が理解していないことは次のとおりです: JavaScript のスコープ。

基本的に、 経由でプロパティにアクセスするthisには、 にネストする必要がありObject.prototypeます。

修正

オブジェクトのプロパティをインラインで定義すると、呼び出しthisは引き続き正しいオブジェクトを指します。ただし、私が紹介したパターンは、あまり人気がありませんが、はるかにきちんとした優れたアプローチです。

これprototypeは、JavaScript による OOP の方法です。堅実な OOP スタイルの JS を探していて、モデルの適切な定義、コードの保守性の向上、およびコーディング スタイルの改善を求めている場合は、私が提供したパターンを使用してクラスを定義することをお勧めします。これにより、静的関数を明確に区別できるようになります。とクラス。これは、すべてがオブジェクトである JavaScript の自然な流れでもあります。

高レベルの JavaScript プログラミング (強力な Ajax アプリケーション、または何らかの理由でブラウザーがより高度な計算を実行する必要があるアプリケーション) では、以下のスタイルが常に優先されます。名前空間の下に配置された静的関数は、引き続き個別に定義されます。

var namespace = {};
namespace.firstStaticFunc = function() {/*do stuff etc;*/};
namespace.secondStaticFunc = function() { return !1; };

定義パターンを使用する唯一の理由は、列挙型とハッシュ マップです。例えば:

var typesOfChicken = {
    RED: 'red',
    BLUE: 'blue'
};

上記は、国際化やハードコードされた値の回避などに常に使用されます。また、JS ミニファイヤがより良い仕事をするのにも役立ちます。上記を考えると、次のように言えます。

console.log(typesOfChicken.RED);// will print red.
console.log("red");// wil still print red

しかし、赤を別のものに変更したい場合は、列挙型を使用して 1 つの変更を行うだけで済みます。typesOfChicken.REDまた、ミニファイアはab に置き換えることができます"RED"が、常に「RED」になります。それは縮小不可能です。

var firstObject = function() { };
firstObject.prototype.myName = "Swapnesh Sinha";//this will not be nested as an instance property.
firstObject.prototype.sayHello = function() {
    alert(this.myName);// will now correctly display Swapnesh Sinha
};
// to use your first object.
var instance = new firstObject();
instance.sayHello();

スコープを適切に利用するには、オブジェクト指向パターンであり、JS でクラスを定義するための正しいアプローチである、私が示したパターンを使用してください。

これで、JavaScript コードを整理する優れた方法が得られました。保守がかなり容易になり、スコープがより明確になり、最も重要なこととして、静的関数とクラスをすぐに区別できるようになりました。

于 2013-03-15T17:25:18.367 に答える
0

sayHello 関数で document.write() を return に置き換えます

于 2013-03-15T17:25:45.937 に答える