我的功能如下:
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';
}
在这种情况下父母可以设置为“某个默认值”吗?
答案 0 :(得分:36)
在非严格模式下,this
经历了Object(this)
转换,因此它始终是真实的。映射到全局对象的例外是null
和undefined
。所以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作用域,您可以看到会发生什么。我在这里举了一个例子:
简而言之,这根据经验证明浏览器动态地将'null'更改为'window'。如果您将null更改为'a',您将看到像您期望的'a'警报。来自链接的代码作为参考:
function a() {
alert(this)
}
a.apply(null)
答案 4 :(得分:0)
没有。 this
的值永远不会是文字'some default value'
。
答案 5 :(得分:0)
this
不能为空。如果它为null,那么你不能在方法范围内。