1、setTimeout中的延迟执行代码中的this永远都指向window

    1. setTimeout("alert(this)", 1)
    2. // 对象中函数执行
    3. var obj = {
    4. say: function() {
    5. setTimeout("alert('in obj ' + this)", 0)
    6. }
    7. }
    8. obj.say();

    对象中的匿名函数

    1. // 对象中的匿名函数
    2. var obj = {
    3. say: function() {
    4. setTimeout(function(){alert(this)}, 0)
    5. }
    6. }
    7. obj.say();

    函数方式引入执行

    1. function talk() {
    2. alert(this);
    3. }
    4. var obj = {
    5. say: function() {
    6. setTimeout(talk, 0)
    7. }
    8. }
    9. obj.say();

    2、setTimeout(this.method, time)这种形式中的this,是根据上下文来判断的,默认为全局作用域,但不一定总是处于全局下,具体问题具体分析

    • setTimeout环境下的this:setTimeout(this.method, time),这个this根据环境来定

    延迟函数内执行环境的this:setTimeout(function(){console.log(this);}, time),这个this永远指向window

    1. var value=33;
    2. function Foo() {
    3. this.value = 42;
    4. this.method = function() {
    5. alert(this) // [object Window]
    6. alert(this.value); // 33
    7. };
    8. setTimeout(this.method, 500);
    9. }
    10. new Foo();

    3、setTimeout(匿名函数, time)这种形式下,匿名函数中的变量也需要根据上下文来判断,具体问题具体分析。

    1. // 类似于promise的reslove执行
    2. var test = "in the window";
    3. setTimeout(function() {alert('outer ' + test)}, 0); // outer in the window
    4. function f() {
    5. var test = 'in the f!';
    6. function ff() {alert('inner ' + test)} // inner in the f!
    7. setTimeout(ff, 0);
    8. }
    9. f();

    4、setTimeout方法是挂在window对象下的,而超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined