亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

一道關于javascript this指向問題

一道關于javascript this指向問題

收到一只叮咚 2019-03-15 18:13:34
一道關于javascript指針的題目,求詳細的解答分析。var length = 10;function fn(){    alert(this.length)}var obj = {    length: 5,    method: function(fn){        fn() // ?        arguments[0]() // ?    }}obj.method(fn)
查看完整描述

9 回答

?
元芳怎么了

TA貢獻1798條經驗 獲得超7個贊

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指向的是全局的window或process,所以打印出來的length是全局的,也就是10。第二個arguments[0]()則有了對象上下文arguments,此時其this指向arguments,從而打印出來的length其實是arguments.length,即為1,


查看完整回答
反對 回復 2019-03-24
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

如果直接把這段代碼放在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.

    }

}


查看完整回答
反對 回復 2019-03-24
?
UYOU

TA貢獻1878條經驗 獲得超4個贊

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


查看完整回答
反對 回復 2019-03-24
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

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]()指向這個知識點:

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

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

舉個例子:

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

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

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


查看完整回答
反對 回復 2019-03-24
?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

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


查看完整回答
反對 回復 2019-03-24
?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

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


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


var obj = {

    fn: function () {console.log(this)}

    1: function () {console.log(this)}

}

obj.fn()

obj[1]()

// 這倆調用沒什么區別,都是對象方法的調用,arguments[0]()同理


查看完整回答
反對 回復 2019-03-24
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

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


查看完整回答
反對 回復 2019-03-24
?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

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


查看完整回答
反對 回復 2019-03-24
?
莫回無

TA貢獻1865條經驗 獲得超7個贊

正確答案是:


undefined

1

第一個好理解,function在沒有綁定this前,都指向window對象。

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


查看完整回答
反對 回復 2019-03-24
  • 9 回答
  • 0 關注
  • 578 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號