天天看點

每天一道面試題--- js 中 this 指針的用法

普通this指針指向問問題:

  • 1.預編譯過程中的this–>window
  • 2.全局作用域中的this–>window
  • 3.一般情況下的this–>調用者(誰調用指向誰);
  • 4.call/apply,改變this指向,指向第一個參數
  • 5.object.function(){} this–>object;
  • 6.普通函數中的this,是window;
  • 7.對象.方法中的this是目前對象;
  • 8.定時器的this是window;
  • 9.構造函數中的this是執行個體對象;
  • 10.原型對象中的this是執行個體對象。
  • 全局環境下的this
    • 在全局環境下,this指針始終指向的全局對象(window);

    console.log(this===window);//true

第一題:

var x = 3;

var foo = {
    x: 2,
    baz: {
        x: 1,
        bar: function() {
            return this.x;
        }
    }
}

var go = foo.baz.bar;

alert(go());
alert(foo.baz.bar());
           
  • 1,2
  • 1,3
  • 2,1
  • 2,3
  • 3,1
  • 3,2

答案:3,1

解答:

var go = foo.baz.bar;  --> go = this.x   ---> go 的作用域是全局,是以是 window。
this指向執行時刻的作用域,go的作用域是全局,是以相當于window,取到的就是window.x,也就是var x=3;這裡定義的x。
foo.baz.bar()  ---->
而foo.baz.bar()裡面,this指向foo.baz,是以取到的是這個上面的x,也就是1。
           

第二題:

var x = 4,
    obj = {
        x: 3,
        bar: function() {
            var x = 2;
            setTimeout(function() {
                var x = 1;
                alert(this.x);
            }, 1000);
        }
    };
obj.bar();
           
  • 1
  • 2
  • 3
  • 4
  • undefined

答案:4

解答:

4,不管有這個setTimeout還是把這個函數立即執行,它裡面這個function都是孤立的,this隻能是全局的window,即使不延時,改成立即執行結果同樣是4。

第三題

x = 1;
function bar() {
    this.x = 2;
    return x;
}
var foo = new bar();
alert(foo.x);
           
  • 1
  • 2
  • undefined

答案:2

這裡主要問題是最外面x的定義,試試把x=1改成x={},結果會不同的。這是為什麼呢?

在把函數當作構造器使用的時候,如果手動傳回了一個值,

  • 要看這個值是否簡單類型,如果是,等同于不寫傳回,
  • 如果不是簡單類型,得到的就是手動傳回的值。
  • 如果,不手動寫傳回值,就會預設從原型建立一個對象用于傳回。