this指針的問題

原文鏈接:https://blog.csdn.net/sinat_36521655/article/details/80253311

let聲明變量會形成塊級作用域,且不存在聲明提升,而var存在聲明提升。所以當使用let聲明變量時,不存在聲明提升,length屬性實際上並沒有添加到window對象中。從下面的例子可以看出
在這裏插入圖片描述

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

是不是奇怪爲啥輸入(fn,1)兩個參數,是不是賊奇怪爲什麼不是10和5或者5和5??哈哈,慢慢解釋。

最先我以爲是形參與實參的問題,但是後來發現不是這樣,於是去跑了個例子

var length = 10;
function fn() {
    console.log(this.length);
}
 
var obj = {
  length: 5,
  method: function() {
    fn();
  }
};
 
obj.method();

上面例子的代碼運行後,輸出依然是10。如果按照之前實參與形參的想法,輸出應該是5的,所以與形參和實參沒有關係。這裏的this綁定到了全局對象上,即window對象上。

var length = 10;
function fn() {
    console.log(this.length);
}
 
var obj = {
  length: 5,
  method: function() {
    fn.call(this);
  }
};
 
obj.method();

當我利用call方法改變this的綁定後,輸出就是5了,說明this綁定到了obj對象上。

此時這個問題就需要回到那句"this永遠指向調用他的對象"話了,在執行obj.method()方法時,如果函數內部有this,則this確實是指向obj,但是method()內部執行的是fn()函數,而fn()函數綁定的對象是window,即window.fn()。還是用例子來說明。

var length = 10;
function fn() {
    console.log(this.length);
}
 
var obj = {
  length: 5,
  method: function() {
    console.log(this.length);//輸出5,執行method方法時,this綁定到調用對象obj上
    fn();//輸出10,執行method方法時,內部執行的是fn()函數,this綁定到了window上,即window.fn();
  }
};
 
obj.method();//輸出5 10

然後別忘了全局函數fn同時也屬於arguments數組中的一員,即當作爲arguments成員之一調用的時候,其作用域就綁定到了arguments上,this也就是指向了arguments對象,所以arguments0這段代碼調用了身爲成員的fn()函數,this.length就等於是arguments.length,又因爲method傳入的參數爲2個,所以最後輸出2

原文鏈接:https://blog.csdn.net/sinat_36521655/article/details/80253311

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章