“这个”是指什么

时间:2010-11-19 07:36:00

标签: javascript

在以下代码上下文中引用的 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; 
    }; 
};
}

由于

2 个答案:

答案 0 :(得分:10)

this值设置为隐式,具体取决于调用函数的方式,有三种情况会发生这种情况:

  1. 当调用没有基础对象或非引用的引用时:

    myFn();             // the myFn reference has no base object
    (function () {})(); // non-reference
    

    this值将指向全局对象 1

  2. 当引用包含基础对象时,例如:

    myObj.method();
    

    this内的method值将指向myObj

  3. 使用new运算符时:

    var obj = new Foo();
    

    this函数中的Foo值将指向一个新创建的对象,该对象继承自Foo.prototype

  4. this值也可以使用callapply方法设置为显式,例如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