鍍金池/ 問答/HTML/ 一道關于javascript this指向問題

一道關于javascript this指向問題

一道關于javascript指針的題目,求詳細的解答分析。

var length = 10;
function fn(){
    alert(this.length)
}
var obj = {
    length: 5,
    method: function(fn){
        fn() // ?
        arguments[0]() // ?
    }
}

obj.method(fn)
回答
編輯回答
撿肥皂

如果直接把這段代碼放在html里面的script標簽里面,length就是全局變量了,可以在windows下面看到length。

var length = 10;
function fn(){
    alert(this.length)
}
var obj = {
    length: 5,
    method: function(fn){
        fn() // 這里輸出的是你定義的windows下面全局變量length 10
        arguments[0]() // 這里arguments的length為1,而fn 里面的this指向arguments,所以輸出1.
    }
}
2017年7月13日 18:45
編輯回答
祈歡

我感覺fn()你應該是會的,函數的直接調用。

arguments[0]()可以看下這個。

var obj = {
    fn: function () {console.log(this)}
    1: function () {console.log(this)}
}
obj.fn()
obj[1]()
// 這倆調用沒什么區(qū)別,都是對象方法的調用,arguments[0]()同理

這有問題??

2018年9月12日 09:18
編輯回答
夏夕

樓上的說得很對,這里告訴樓主一句話判斷this指向問題: 誰調用的,this就指向誰,沒有調用者,非嚴格模式下就是window,否則undefined

2018年8月31日 15:50
編輯回答
憶往昔

正確答案是:

undefined
1

第一個好理解,function在沒有綁定this前,都指向window對象。
第二個,必須理解arguments這個參數。指的是function的所有實參,與形參無關。也就是調用函數時,實際傳入的參數,以對象形式存在:{"0": "", "1": ""},本題中的值為:{ '0': [Function: fn] }。那么arguments[0]就是[Function: fn],當調用arguments[0]()時,this指向的是arguments對象,相當于調用了arguments.length,所以值為1

2018年6月26日 22:42
編輯回答
舊時光

第一個fn()this指向win win對象的length屬性并沒有定義值,所以返回undefined,第二個this指向argumengts對象,因為fn作為一個參數存儲在arg對象里,argumengts的長度為1

2017年2月1日 00:18
編輯回答
糖果果

第一個指向window,第二個指向method

2018年8月10日 16:51
編輯回答
忘了我

第一個直接調用fn,this指向window。第二個arguments[0](),相當于一個對象調用自身的某個屬性函數(類似obj.fn(),fn函數中的this會指向obj。),所以第二個this指向arguments。

2018年4月10日 21:17
編輯回答
單眼皮
var length = 10;
function fn() {
  console.log('fn:', this);
  console.log('fn:', this.length);
} 
var obj = {
  length: 5,
  method: function(fn) {
    fn() // ?
    console.log(arguments[0]);
    arguments[0](); // ?
  }
};

obj.method(fn);

這樣會清楚一點。第一個fn()由于沒有對象上下文,所以直接調用fn()時其this指向的是全局的windowprocess,所以打印出來的length是全局的,也就是10。第二個arguments[0]()則有了對象上下文arguments,此時其this指向arguments,從而打印出來的length其實是arguments.length,即為1,

2017年1月30日 08:02
編輯回答
脾氣硬
var length = 10;
function fn(){
    alert(this.length)
}
var obj = {
    length: 5,
    method: function(fn){
        fn() // 10 指向 window
        arguments[0]() // 1 指向 arguments
    }
}
obj.method(fn)

第一個問題:fn() 指向這個知識點:

任意函數里如果嵌套了 非箭頭函數,那這個時候 嵌套函數里的 this 在未指定的情況下,應該指向的是 window 對象

第二個問題:arguments[0]()指向這個知識點:

在方法調用(如果某個對象的屬性是函數,這個屬性就叫方法,調用這個屬性,就叫方法調用)中,執(zhí)行函數體的時候,作為屬性訪問主體的對象和數組便是其調用方法內 this 的指向。(通俗的說,調用誰的方法 this 就指向誰;)

這個地方,可能會讓人迷惑,arguments[0]指向 fn,所以 arguments[0]() 是作為 arguments對象的屬性[0]來調用 fn的,所以 fn 中的 this 指向屬性訪問主體的對象 arguments;

舉個例子:

[function fn(){alert(this.length)}][0]()//1

數組也是對象,只不過數組對象的整型屬性會計入 length 屬性中,并被區(qū)別對待,這里就是調用數組對象的0屬性,函數作為數組對象的屬性調用,函數中的this 當然指向這個數組,所以返回數組的length ,當然是 1;

其他詳情戳js 中 this 的指向問題

2018年3月9日 02:35