在以下代码上下文中引用的 this (内部函数内部)是什么?它是否指向TimeSpan?
var TimeSpan = function (days, hours, minutes, seconds, milliseconds) {
var attrs = "days hours minutes seconds milliseconds".split(/\s+/);
var gFn = function (attr) {
return function () {
return this[attr];
};
};
var sFn = function (attr) {
return function (val) {
this[attr] = val;
return this;
};
};
}
由于
答案 0 :(得分:10)
this
值设置为隐式,具体取决于调用函数的方式,有三种情况会发生这种情况:
当调用没有基础对象或非引用的引用时:
myFn(); // the myFn reference has no base object
(function () {})(); // non-reference
this
值将指向全局对象 1
当引用包含基础对象时,例如:
myObj.method();
this
内的method
值将指向myObj
。
使用new
运算符时:
var obj = new Foo();
this
函数中的Foo
值将指向一个新创建的对象,该对象继承自Foo.prototype
。
this
值也可以使用call
和apply
方法设置为显式,例如call
:< / p>
function test(a) {
return alert(this + a);
}
test.call("hello", " world"); // alerts "hello world"
或者如果我们需要将一组参数从数组“应用”到函数中,则使用apply
:
function test(a, b) {
return alert(this + a + b);
}
var args = ["my ", "world "];
test.apply("hello ", args); // alerts "hello my world"
[1] 新的ECMAScript 5th Strict Mode已更改,现在是一个没有基础对象的函数引用,或者调用非引用(作为第一种情况),this
值将包含undefined
。
这是因为在使用构造函数时,人们在调用构造函数时经常忘记使用new
运算符。
当发生这种情况时,this
值指向全局对象,最终添加了不需要的全局属性。
现在在严格模式下,this
将包含未定义的,如果对其进行属性查找(this.foo = 'foo'
),我们将有一个很好的TypeError
异常,而不是具有全局{ {1}}属性。
答案 1 :(得分:1)
this
指的是当前对象,在本例中是您所在的函数。由于JavaScript中的所有内容都是对象,因此您可以使用this
关键字修改函数对象的属性:
var f = function() {
this.key = "someValue";
}
console.log(f.key); // prints "someValue"
因此,在这种情况下,this
应指向最深范围级别的函数,而不是TimeSpan
。