Подтвердить что ты не робот

Может ли 'this' когда-либо иметь значение null в Javascript

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

    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';
    }

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

4b9b3361

Ответ 1

В нестрогом режиме 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 передается без изменения как это значение. Это изменение из версии 3, где undefined или null thisArg заменяется на глобальный объект и ToObject применяется ко всем другим значениям, и этот результат передается как это значение.

Ответ 2

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

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

Ответ 3

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

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

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

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

Здесь jsFiddle.

Ответ 4

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

http://jsfiddle.net/rXsWj/

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

function a() {
    alert(this)
}

a.apply(null)

Ответ 5

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

Ответ 6

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