鍍金池/ 問答/HTML/ 一道關(guān)于this指向的問題

一道關(guān)于this指向的問題

題目如下:

var length = 10;
function fn() {
    console.log(this.length)
};
var obj = {
    length: 5, 
    method: function (fn) {
        fn();
        arguments[0]();
        fn.call(obj, 12);
    }
};
obj.method(fn, 1);

我的解讀如下:

obj.method(fn, 1); 這一段其實是method作為obj的方法調(diào)用,this隱式綁定到obj上。執(zhí)行的是

{
    // 此次調(diào)用的this指向obj,arguments為function () { console.log(this.length) }, 1
    fn();
    arguments[0]();
    fn.call(obj, 12);
}

這三條語句。

第一個fn是打印出this.length,以我的理解,this在調(diào)用時確定指向,在method函數(shù)內(nèi)這里的this隱式綁定到obj上,結(jié)果是打印出5;
第二條語句其實還是fn,但是this綁定誰我不知道,所以結(jié)果我也不知道;
第三條語句的this綁定給obj,后面的12是fn的參數(shù)沒有用,所以打印出5;

結(jié)果我的分析只有最后一個答案是正確的,求解惑。

回答
編輯回答
憶往昔

this只需要看執(zhí)行的時候,其他的地方都不要看。

  1. fn()不屬于任何對象,沒使用call,直接調(diào)用,this是window(瀏覽器下),所以是length=10;
  2. arguments[0],這個其實有點繞,你可以試試var arr = [function(){console.log(this.length)];arr[0](),它其實屬于這種調(diào)用方式arguments.0()(當(dāng)然這么寫是不對的),所以this是arguments,而arguments長度就是你傳入的參數(shù)的個數(shù)2。
  3. fn.call(obj, 12);這個就不用說了,this就是obj,length=5

舉個例子

var length = 10
var arr = [
    function () {
        console.log(this.length)
    }
]
var fun = arr[0]
fun() //10

這個你可能會問,函數(shù)不是屬于arr的么,為什么是10?
只與調(diào)用時有關(guān)fun()直接調(diào)用的,就是window


補充下箭頭函數(shù)的吧

var length = 10;
var fn = () => {
    console.log(this.length)
};
var obj = {
    length: 5, 
    method: function (fn) {
        fn();
        arguments[0]();
        fn.call(obj, 12);
    }
};
obj.method(fn, 1);

你可以再看看這個
箭頭函數(shù)沒有自己的this,只會就近(這個就近是聲明位置的就近)取,所以一直是window。

2018年8月12日 01:43
編輯回答
吃藕丑

以前我剛學(xué)js的時候在慕課網(wǎng)上,老師就說this的問題。
this就是函數(shù)作為方法被調(diào)用時,所處的對象。
不知道理解有誤沒。

2017年1月19日 20:55
編輯回答
涼汐

第一個fn是作為函數(shù)來調(diào)用的,他的this為window
第二個this是function(fn){}的arguments對象,具有arguments具有是具有l(wèi)ength的偽數(shù)組,這是為什么是輸出是2呢,是因為obj.metnod(fn,1) 你傳入了2個參數(shù).
第三個是this 指向 obj

2017年1月16日 03:05
編輯回答
嘟尛嘴

請大聲告訴我,正確答案是不是110

2018年3月7日 16:19