在Javascript中,'this'可以为null

时间:2012-03-16 15:12:01

标签: javascript null this

我的功能如下:

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

在这种情况下父母可以设置为“某个默认值”吗?

6 个答案:

答案 0 :(得分:36)

在非严格模式下,this经历了Object(this)转换,因此它始终是真实的。映射到全局对象的例外是nullundefined。所以this永远不会null,而且总是真的,这使得这两项检查都是多余的。

然而,在严格模式下,this可以是任何东西,因此在这种情况下你必须要小心。但是你必须自己选择严格模式,所以如果你不这样做就没有后顾之忧。

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

ES5的specification说:

  

thisArg值传递无需修改作为此值。这是对版本3的更改,其中未定义或null thisArg替换为全局对象 ToObject 应用于所有其他值,结果将作为此传递值。

答案 1 :(得分:2)

虽然不能直接回答你的问题..但在浏览器中,“这个”默认情况下会引用“窗口”对象。在nodejs上,它将引用全局对象。

我不确定是否曾经有过这样的情况,但它至少是不寻常的。

答案 2 :(得分:2)

this关键字不应为空,但可能不是您所期望的。如果您不小心,最终可以引用window对象。

在您的情况下,我认为this应该引用doSomething函数。

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

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

这是jsFiddle

答案 3 :(得分:1)

如果您尝试强制Javascript在任何浏览器中使用null作用域,您可以看到会发生什么。我在这里举了一个例子:

http://jsfiddle.net/rXsWj/

简而言之,这根据经验证明浏览器动态地将'null'更改为'window'。如果您将null更改为'a',您将看到像您期望的'a'警报。来自链接的代码作为参考:

function a() {
    alert(this)
}

a.apply(null)

答案 4 :(得分:0)

没有。 this的值永远不会是文字'some default value'

答案 5 :(得分:0)

this不能为空。如果它为null,那么你不能在方法范围内。