2012-03-16 6 views
29

にnullを指定できます。は、「これは」今まで私は、次の線に沿って機能を持っているのJavascript

doSomething: function() { 
     var parent = null; 

     if (this === null) { 
      parent = 'some default value'; 
     } else { 
      parent = this.SomeValue(); 
     } 
    } 

親がこれまでに「いくつかのデフォルト値」に設定するまたはnullのチェックは不要ですでした?私はより制限を使用する場合

はまた、何を:

doSomething: function() { 
     var parent = this ? this.SomeValue() : 'some default value'; 
    } 

を親が今までにこの場合の「いくつかのデフォルト値」に設定されていませんか?

答えて

36

非厳密モードでは、thisObject(this)の変換を受けています。したがって、常に真実です。例外はグローバルオブジェクトにマップするnullundefinedです。だからthisは決してnullであり、常に真実であり、両方のチェックを余計にする。

ただし、thisは何でも構いませんので、注意する必要があります。しかし、再び厳格なモードを選択する必要があります。そうしないと心配はありません。

(function() {    return this; }).call(null); // global object 
(function() { "use strict"; return this; }).call(null); // null 

ES5のspecificationは言う:

thisArg値は変更せずにを渡されこの値として。これは、未定義またはnull thisArgがグローバルオブジェクトおよびに置き換えられ、ToObjectが他のすべての値に適用され、その結果がこの値として渡される、エディション3からの変更です。

+0

このようなプロパティのないオブジェクト上の「someValueの()」機能*少し*心配のための原因である可能性がありますを呼び出そうことに留意すべきです。 – Pointy

+0

さて、技術的には、オブジェクトであれば、それはしません、そしてもっと重要なことに、最初は 'null'か' undefined'だったので、常にObject(this)グローバルオブジェクトに直接設定されているだけです。 – davin

+0

@davin:実際には、オブジェクトの場合(Object(obj)=== obj')どうかは関係ありませんが、2番目の点については完全に正しいです。 – pimvdb

2

あなたの質問に直接答えはありませんが、ブラウザの 'this'はデフォルトで 'window'オブジェクトを参照します。 nodejsでは、グローバルオブジェクトを参照します。

nullになる可能性があるのか​​どうかはわかりませんが、それは少なくとも珍しいことです。

+0

Welp ..役に立つかもしれないので私の答えは残しておきますが、pimvdbはもっと良い答えを持っています:) – Evert

2

キーワードthisはnullではありませんが、期待通りではありません。注意しないと、windowオブジェクトを参照することになります。

あなたの場合、thisdoSomething機能を参照する必要があります。

var myObject = { 
    myMethod: function() { 
     console.log(this); 
    } 
}; 

myObject.myMethod(); // prints out a reference to the myMethod function 

ここにはjsFiddleがあります。

0

いいえ。thisの値は決してテキスト'some default value'になりません。

0

this nullにすることはできません。それがnullの場合は、メソッドのスコープに入れることができませんでした。

1

Javascriptで任意のブラウザでnullスコープを使用しようとすると、何が発生するのかを確認できます。私はここで例を作った。要するに

http://jsfiddle.net/rXsWj/

を、これは経験的にブラウザがその場で「ウィンドウ」に「ヌル」を変更することを証明しています。代わりにnullを 'a'に変更すると、期待どおりの「a」のアラートが表示されます。参照としてリンクからコード:

function a() { 
    alert(this) 
} 

a.apply(null) 

関連する問題