Может ли это когда-либо быть нулевым в Javascript? - PullRequest
29 голосов
/ 16 марта 2012

У меня есть функция следующего содержания:

    doSomething: function () {
        var parent = null;

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

Может ли родительский элемент когда-либо быть установлен на «некоторое значение по умолчанию» или проверка на ноль лишняя?

В качестве альтернативы, что если бы я использовал менее строгие ограничения:

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

Может ли родительский элемент когда-либо быть установлен на «некоторое значение по умолчанию» в этом случае?

Ответы [ 6 ]

36 голосов
/ 16 марта 2012

В нестрогом режиме this претерпел преобразование Object(this), поэтому оно всегда правдиво. Исключения составляют null и undefined, которые отображаются на глобальный объект. Так что this никогда не бывает null и всегда правдиво, делая обе проверки лишними.

В строгом режиме, однако, this может быть чем угодно, поэтому в этом случае вам следует остерегаться. Но опять же, вы должны сами выбрать строгий режим, поэтому, если вы этого не сделаете, не стоит беспокоиться.

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

Спецификация ES5 гласит:

Значение thisArg передается без изменения как значение this. Это изменение по сравнению с выпуском 3, где неопределенный или нулевой thisArg заменяется на глобальный объект и ToObject применяется ко всем другим значениям, и этот результат передается как значение this.

2 голосов
/ 16 марта 2012

Ключевое слово this не должно быть нулевым, но оно может не соответствовать ожидаемому.Вы можете в конечном итоге ссылаться на объект window, если не будете осторожны.

В вашем случае, я считаю, this должен ссылаться на функцию doSomething.

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

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

Вот jsFiddle .

2 голосов
/ 16 марта 2012

Хотя это и не прямой ответ на ваш вопрос .. в браузере «this» по умолчанию ссылается на объект «window». На nodejs он будет ссылаться на глобальный объект.

Я не уверен, есть ли когда-нибудь случай, когда он может быть нулевым, но это будет, по крайней мере, необычно.

1 голос
/ 16 марта 2012

Вы можете увидеть, что произойдет, если попытаетесь заставить Javascript использовать нулевую область в любом браузере. Я сделал пример здесь:

http://jsfiddle.net/rXsWj/

Короче говоря, это эмпирически доказывает, что браузер на лету меняет 'null' на 'window' Если вместо этого вы измените ноль на «а», вы увидите предупреждение «а», как и следовало ожидать. Код из ссылки в качестве ссылки:

function a() {
    alert(this)
}

a.apply(null)

1009 *

0 голосов
/ 16 марта 2012

this не может быть нулевым.если он был нулевым, то вы не могли бы быть в области видимости метода.

0 голосов
/ 16 марта 2012

Нет. Значение this никогда не будет текстом 'some default value'.

...